DYF
我思故我在!

 

五、互斥对象内核对象

互斥对象内核对象,能够确保线程拥有对单个资源的互斥访问权。互斥对象包含使用计数、线程ID(用于标识系统中的哪个线程当前拥有互斥对象)、递归计数器(用于指明该线程拥有互斥对象的次数)。

互斥对象的行为特性与关键代码段相同,但是互斥对象属于内核对象(不同进程中的多个线程能够访问单个互斥对象,并且线程在等待访问资源时可以设定一个超时值)。而关键代码段则属于用户方式对象。互斥对象的运行速度比关键代码段要慢。

互斥对象内核对象用于保护由多个线程访问的内存块。保证访问内存块的任何线程拥有对该内存块的独占访问权,这样就能够保证数据的完整性。

互斥对象的使用规则:线程ID=0,互斥对象不为任何线程所有,发出通知信号;ID!=0,一个线程拥有互斥对象,不发出互斥信号通知事件;允许互斥对象内核对象使用异常。

1、创建互斥对象内核对象

要使用互斥对象,必须有一个进程首先调用CreateMutex

HANDLE CreateMutex(PSECURITY_ATTRIBUTES psa, BOOL fInitialOwner, PCTSTR pszName)

fInitialOwner设置互斥对象的初始状态,FALSE(通常值)表明互斥对象ID与递归计数器均置为0TRUE表示线程ID设为调用调用线程的ID,递归计数设1

HANDLE OpenMutex(DWORD fdwAccess, BOOL bInheritHandle, PCTSTR pszName)

另一个进程可以通过OpenMutex获得它自己进程与现有互斥对象相关的句柄。

2、释放互斥对象内核对象

BOOL ReleaseMutex(HANDLE hMutex)

调用线程将查看本线程ID与互斥内核对象ID是否一致,是则释放,否则返回FALSEERROR_NOT_OWNER),什么都不做。只有互斥对象能够跟踪哪个线程成功地等待到该对象(其它对象不对此进行跟踪)。

posted on 2009-05-30 10:23  o(∩_∩)o...  阅读(140)  评论(0编辑  收藏  举报