《VC语言6.0程序设计从入门到精通》第91章


等待。
Win32 提供了创建互斥器 CreateMutex() ,打开互斥器 OpenMutex() ,释放互斥器 
ReleaseMutex()等操作。
Mutex 的拥有权并非属于产生它的那个线程,而是属于最后对此 Mutex 进行等待操作 
( 
WaitForSingleObject )并且尚未进行 ReleaseMutex()操作的线程。线程拥有 Mutex 就好像进 
入临界区一样,一次只能有一个线程拥有该 Mutex 。如果一个拥有 Mutex 的线程在返回之前 
没有调用 ReleaseMutex() ,那么这个 Mutex 就被舍弃了。当其他线程等待这个 Mutex 时,仍 
能返回,并得到一个 WAIT_ABANDONED_0 返回值,一个 Mutex 被舍弃是 Mutex 特有的功 
能。下面详细介绍 Mutex 相关的函数。
(1)CreateMutex
函数 CreateMutex 用来创建或打开有名或无名的 Mutex 对象。如果调用成功,函数返回 
创建后对象的句柄 。如果同名 Mutex 对象在创建之前就已经存在,则函数返回现有的对象的 
句柄,并且 GetLastError 函数返回 ERROR_ALREADY_EXISTS 。否则返回创建的 Mutex 对 
象句柄。如果调用失败,返回空值。它的函数原型如下:
HANDLE CreateMutex(
LPSECURITY_ATTRIBUTES lpMutexAttributes;
BOOL bInitialOwner;
LPCTSTR lpName
);
函数中主要参数的意义如下。
o lpMutexAttributes :指向 SECURITY_ATTRIBUTES 结构的指针,决定返回的句柄是否 
可以被子进程继承。如果为空,则不能被继承。
·239 ·
…………………………………………………………Page 251……………………………………………………………
Visual C++ 6。0 程序设计从入门到精通
o bInitialOwner : 指 定 Mutex 对 象 的 初 始 拥 有 者 。 如 果 调 用 者 创 建 Mutex 并 且 
bInitialOwner 为 TRUE,调用线程获得 Mutex 对象的拥有权。否则,调用线程不拥有 
Mutex 的所有权。
o lpName :Mutex 对象的名称。字符串的最大长度为 MAX_PATH 个字符。字符串区分 
大小写。如果 lpName 和一个现有的 Mutex 对象重名,函数需要对已有的对象有 
MUTEX_ALL_ACCESS 的访问权。这种情况下,参数 bInitialOwner 被忽略,因为此 
时它已经被已有的进程初始化。如果 lpMutexAttributes 非空,它决定句柄是否可以被 
继承,但是它的安全描述成员被忽略。如果 lpName 为空,创建的 Mutex 对象没有名 
称。
(2 )OpenMutex
函数 OpenMutex 用来打开一个存在的有名称的 Mutex 对象。如果调用成功,返回打开的 
对象的句柄。反之则返回空值。它的函数原型如下:
HANDLE OpenMutex(
DWORD dwDesiredAccess;
BOOL bInheritHandle;
LPCTSTR lpName
);
函数主要参数的意义。
o dwDesiredAccess :指定希望对 Mutex 对象进行的访问类型。可以是下面值的组合:
· MUTEX_ALL_ACCESS :可以对 Mutex 对象进行所有访问。
· SYNCHRONIZE:允许任何等待函数获得 Mutex 对象的所有权。
o bInheritHandle :指定返回的句柄是否可以被继承。
o lpName :要打开的 Mutex 对象的名称。
(3 )ReleaseMutex
函数 ReleaseMutex 释放指定的 Mutex 对象的所有权。如果调用线程没有 Mutex 对象的所 
有权,则说明调用失败。它的函数原型如下:
BOOL ReleaseMutex(
HANDLE hMutex
);
函数中主要参数的意义如下。
o hMutex :Mutex 对象的句柄。
(4 )CMutex
Mutex 在 MFC 中相应的类是 CMutex 。CMutex 通过构造函数创建一个互斥器对象。当 
某个资源在一个时间只允许一个线程访问的时候,互斥器正好派上用场。
CMutex 只有一个构造函数 CMutex::CMutex,它的函数原型如下: 
CMutex(
BOOL bInitiallyOwn = FALSE;
LPCTSTR lpszName = NULL;
LPSECURITY_ATTRIBUTES lpsaAttribute = NULL
·240 ·
…………………………………………………………Page 252……………………………………………………………
第 9 章 多线程
);
函数中主要参数的意义如下。
o bInitiallyOwn :指定创建线程是否在 CMutex 对象初始创建时访问互斥器控制的资源。
o lpszName :CMutex 对象的名称。如果有同名的互斥器存在,如果为空,互斥器就没 
有名称。如果和已有的互斥对象同名,构造函数创建一个以存在名称为参考的新的 
CMutex 对象。如果名称和已有的其他同步对象同名,构造将失败。
o lpsaAttribute :互斥对象的安全属性。
5 .信号量(Semaphore)
信号量是最具历史的同步机制 。信号量是解决 producer/consumer 问题的关键要素。对应 
的 MFC 类是 CSemaphore 。Win32 函数 CreateSemaphore()用来产生信号量。ReleaseSemaphore() 
用来解除锁定。Semaphore 的现值代表的意义是目前可用的资源数,如果 Semaphore 的现值 
为 1,表示还有一个锁定动作可以成功。如果现值为 5,就表示还有 5 个锁定动作可以成功。 
当调用 Wait 等函数要求锁定,如果 Semaphore 现值不为 0,Wait 马上返回,资源数减 1。当 
调用 ReleaseSemaphore()资源数加 1,当时不会超过初始设定的资源总数。
(1)CreateSemaphore
函数 CreateSemaphore 用来创建或者打开 Semaphore 对象。如果调用成功,函数返回创 
建后的对象句柄。如果同名 Semaphore 对象在创建之前就已经存在,则函数返回现有的对象 
的句柄,并且 GetLastError 函数返回 ERROR_ALREADY_EXISTS 。否则返回创建的 Semaphore 
对象句柄。如果调用失败,返回空值。它的函数原型如下:
HANDLE CreateSemaphore(
LPSECURITY_ATTRIBUTES lpSemaphoreAttributes;
LONG lInitialCount;
LONG lMaximumCount;
LPCTSTR lpName
);
函数中主要参数的意义如下。
o lpSemaphoreAttributes :指定 SECURITY_ATTRIBUTES 结构的指针。决定返回的句柄 
是否可以被子进程继承。如果 lpSemaphoreAttributes 为空,则句柄不能被继承。
o lInitialCount :指定 Semaphore 对象的初始计数值 。该值必须大于或等于零并小于或等 
于 lMaximumCount 。
o lMaximumCount :指定 Semaphore 对象的最大数目。必须大于零。
o lpName :Semaphore 对象的名称。字符串的最大长度为 MAX_PATH 个字符。字符串 
区分大小写。
(2 )OpenSemaphore
函数 OpenSemaphore 用来?
小说推荐
返回首页返回目录