`
frenchmay
  • 浏览: 231317 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

锁机制

阅读更多
mutexes

锁住一个未被拥有的mutex,比锁住一个未被拥有的critical section 多 花费几乎100倍的时间。
因为critical section不需要进入操作系统核心,直接在user mode就可以进行操作。

mutexes可以跨进程使用。critical section只能在同一个进程中使用。

等待一个mutex时,你可以指定结束等待的时间长度,当时对于critical section则不行。

critical section                     Mutex
InitializeCriticalSection()   CreateMutex()/openMutex()
EnterCriticalSection() WaitForSingleObject()/WaitForMultipleObjects()/MsgWaitForMultipleObjects()
LeaveCriticalSection()        ReleaseMutex()
DeleteCriticalSection()       CloseHandle()

为了能够跨进程使用同一个mutex,可以在产生mutex时指定其名称。如果指定了名称,系统中的其他任何线程就可以使用这个名称来处理该mutex。

Windows核心对象具有引用计数

mutex具有引用计数,当不再需要一个mutex时,可以调用CloseHandle()将它关闭。mutex有一个引用计数(reference count).每次调用CloseHandle(),引用计数便减1,当引用计数达到0时,mutex便自动被系统清除掉。

mutex使用流程
1 有一个mutex,没有任何线程拥有它,处于非激发状态
2 某个线程调用WaitForSingleObject(),并指定该mutex handle为参数
3Win32于是将该mutex拥有权交给这个线程,然后将此mutex的状态短暂地设为激发状态,于是Wait..()函数返回
4 mutex立刻又被设定为非激发状态,使任何处于等待状态下的其他线程没有办法获得其拥有权。
5 获得该mutex之线程调用releaseMutex(),将mutex释放掉,于是循环回到第一场景,周而复始。

mutex的所有权并非值属于那个产生它的线程,而是那个最后对此mutex进行wait...()操作并且尚未进行releaseMutex()操作的线程。一次只能有一个线程拥有该mutex。

mutex是在其引用计数降为0时被操作系统摧毁的,每当线程对此mutex调用一次closeHandle(),或当此线程结束时,mutex的引用计数即下降1.

被舍弃的mutex
一个正常的程序中,线程绝对不应该在它即将结束前还拥有一个mutex,因为这意味着线程没有能够适当地清除其资源。有时候,线程可能没有在结束前调用releasemutex()。为了解决这个问题,mutex有一个非常重要的特性。这性质在各种同步机制中是独一无二的。如果线程拥有一个mutex而在结束前没有调用releasemutex(),mutex不会被摧毁。取而代之的是,该mutex会被视为"未被拥有"以及"未被激发",而下一个等待中的线程会被以WAIT_ABANDONED_0通知。

semaphore 信号量
semaphore的现值代表的意义是目前可用的资源数。如果semaphore的现值为1,表示还有一个锁定动作可以成功,如果现值为5,表示还有5个锁定动作可以成功。
每当一个锁定动作成功,semaphore的现值就会减一,可以使用任何一种Wait...()函数要求锁定一个semaphore,因此如果semaphore的现值不为0,wait...()函数会立刻返回。这和mutex很像,如果没有任何线程拥有mutex,wait...()会立即返回
如果锁定成功,也不会受到semaphore的拥有权。因为可以有一个以上的线程同时锁定一个semaphore,所以谈semaphore的拥有权是无意义的。一个线程可以反复调用Wait...()以产生新的锁定,这和mutex绝不相同;拥有mutex的线程不论再调用多少次Wait...()函数,也不会被堵塞住。
一旦semaphore的现值降到0,就表示资源已经耗尽,此时,任何线程如果调用Wait...()函数,必然需要等待,直到某个锁定被解除为止

分享到:
评论

相关推荐

    java锁机制Synchronizedjava锁机制Synchronized

    "Java 锁机制 Synchronized" Java 锁机制 Synchronized 是 Java 语言中的一种同步机制,用于解决多线程并发访问共享资源时可能出现的一些问题。 Java 锁机制 Synchronized 的概念 在 Java 中,每个对象都可以被...

    SQL的锁机制

    ### SQL的锁机制 在数据库管理系统(DBMS)中,锁机制是一种重要的并发控制手段,用于确保多个用户或进程能够安全地访问共享资源而不发生冲突。本文将详细探讨SQL Server中的锁机制及其工作原理。 #### 一、为什么...

    sql server锁机制

    SQL Server的锁机制是数据库管理系统中用于控制并发访问和维护数据完整性的重要机制。它确保了在多用户环境中,数据能够被正确地读取和修改,防止出现数据不一致的情况。以下是对SQL Server锁机制的详细解释: 1. *...

    SQL server 中锁机制详解

    "SQL Server 锁机制详解" SQL Server 中的锁机制是为了提供并发控制,防止多个事务同时访问同一个资源时出现的问题。锁机制可以分为悲观锁和乐观锁两种。 悲观锁是一种保守的锁机制,为任何操作(即使是 select)...

    Java锁机制详解.pdf

    Java锁机制是Java多线程编程中的核心概念之一,其主要目的是确保在多线程环境下,多个线程能够安全地访问共享资源,避免数据不一致的问题。Java锁机制的发展历经了多个版本的改进,尤其是Java 5.0引入的显示锁...

    MySQL高级 锁机制

    MySQL的锁机制是数据库管理系统中用于控制并发操作的重要机制,对于多用户环境下的数据一致性、事务隔离性和系统性能有着至关重要的影响。本文将深入探讨MySQL的高级锁机制,包括表锁和行锁,并提供一些优化建议。 ...

    java锁机制详解.pdf

    Java锁机制是多线程编程中的关键概念,用于控制对共享资源的并发访问。在Java中,主要的锁机制包括`synchronized`关键字和`Lock`接口(如`ReentrantLock`)。下面将详细讲解这两种锁机制及其应用。 1. `...

    SQLServer锁机制探究

    SQL Server的锁机制是数据库管理系统中用于确保数据一致性、避免并发操作冲突的重要机制。在高并发的数据库环境中,正确理解和使用锁是至关重要的,因为它直接影响到系统的性能和稳定性。 首先,我们需要了解SQL ...

    Oracle的锁机制

    Oracle的锁机制是数据库管理系统中一个关键的组成部分,它的主要目标是确保在多用户环境下,数据的读一致性、完整性和并行性。Oracle提供了多种类型的锁来满足这些需求。 首先,按照是否独占,锁分为排它锁(X锁)...

    SQL server 2008的锁机制

    在SQL Server 2008中,锁机制是数据库管理系统(DBMS)为了确保数据的一致性和完整性,以及实现多用户并发访问时的一种关键机制。它通过控制对数据的访问来防止并发操作间的冲突,从而避免数据不一致的情况。本文将...

    数据库中锁机制的学习

    数据库中的锁机制是确保数据一致性、并发控制和事务隔离的重要机制。在多用户环境中,当多个用户同时访问和操作同一份数据时,可能会引发数据冲突和不一致。为了解决这些问题,数据库系统引入了锁来协调并发操作。...

    oracle数据库中的锁机制

    ### Oracle数据库中的锁机制 #### 引言 在Oracle数据库中,锁机制是确保数据一致性和并发控制的关键组件。本文将深入探讨Oracle数据库中的锁如何工作,以及它们在多用户环境中如何防止数据冲突,保障事务的正确...

    linux锁机制分析

    ### Linux锁机制分析 #### 一、加锁的原因与竞态条件 在多线程或并发环境下,多个任务对共享资源或数据进行访问时,如果不加以控制,可能会导致数据的一致性问题,甚至数据错乱。例如,在一个简单的计数器增加操作...

    MS SQL Server数据库事务锁机制分析

    MS SQL Server 数据库的事务锁机制是确保数据库完整性和一致性的关键组成部分,它涉及到多用户环境下的并发控制和数据安全。锁是一种软件机制,用于防止多个用户在同一时间对同一资源进行冲突操作,确保数据的一致性...

    浅析SQL Server的锁机制

    SQL Server的锁机制是数据库管理系统中用于确保数据完整性与一致性的关键机制,尤其是在多用户环境中。它通过控制不同事务对共享资源的访问,防止并发操作带来的数据冲突,如丢失更新、脏读、不可重复读和幻觉读等...

    06-VIP-深入理解Mysql事务隔离级别与锁机制.pdf

    深入理解Mysql事务隔离级别与锁机制 Mysql事务隔离级别与锁机制是数据库系统中非常重要的概念,它们都是为了解决多事务并发问题而设计的。下面我们将深入讲解这些机制,让大家彻底理解数据库内部的执行原理。 事务...

    mysql事务与锁机制(存储引擎和锁、MyISAM锁机制、InnoDB锁机制、Next-Key锁、Dead-Lock).docx

    ### MySQL事务与锁机制详解 #### 一、锁概念简介 **1、基础描述** 锁机制主要用于解决数据库中多线程或多个会话同时访问同一数据资源时出现的竞争问题。在MySQL中,锁机制是非常重要的组成部分之一,它与其他核心...

    MySQL8.0锁机制和事务

    MySQL 8.0 锁机制和事务 MySQL 8.0 中的锁机制和事务是数据库系统中非常重要的概念。锁机制是指数据库系统中对数据访问的控制机制,而事务是指数据库系统中的一组操作单元。了解锁机制和事务是非常关键的,因为它们...

    java锁机制Synchronized.pdf

    java锁机制Synchronized.pdf

Global site tag (gtag.js) - Google Analytics