等待。
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 用来?
小说推荐
- C语言游戏编程从入门到精通(PDF格式)
- -Page 1-Page 2-Page 3-Page 4-Page 5-Page 6-Page 7-Page 8-Page 9-Page 10-Page 11-Page 12-Page 13-Page 14
- 最新章:第4章
- oracle从入门到精通(PDF格式)
- -Page 1-Oracle 从入门到精通-Page 2-资源来自网络,仅供学习 Oracle 从入门到精通一、SQL 8
- 最新章:第37章
- php程序设计简明教程(DOC格式)
- -Page 1-PHP 程序设计简明教程PHP 讲义 第 1 页 共 90 页-Page 2-目录序 4第一章 PHP 简介 6
- 最新章:第31章
- VB2008从入门到精通(PDF格式英文版)
- -Page 1(R)The eXperT’s Voice inBeginningVB 2008From Novice to ProfessionalChristian Gross-Page 2-Page 3-Beginning VB 2008From Novice to Professional■C
- 最新章:第214章
- C语言设计
- 作者:谭浩强1 C 语言概述1.1 C语言的发展过程1.2 当代最优秀的程序设计语言1.3 C语言版本1.4 C语言的特点1.5 面向对象的程序设计语言1.6 C和C+1.7 简单的C程序介绍1.8 输入和输出函数1.9 C源程序的结构特点1.10书写程序时应遵循的规则1.11C语言的字符集1.12
- 最新章:第45章
- 设计成婚:不入豪门
- 作者:海未央《设计成婚2:名门新娘》作品介绍《名门新娘》介绍:她是骆家收养的孤女,性格因为受他的影响,变得有些古灵精怪,也懂得是非之分!他说他的一切只为他而努力,可是为什么要拒绝自己呢?什么?没有满十八岁?那今天生日,够十八岁了吧?什么,还太小?太过分了,这不是耍着自己玩吗?嘿嘿,有个邪恶的老师,那
- 最新章:第196章
- 玄学,从入门到放弃
- 《玄学,从入门到放弃》作者:李传言文案:周诣一手拿着卜卦,一手拿着《演员的自我修养,叹息良久。他本是百年前观天占星的玄术师,谁知却一朝重生现代。他只想平淡地生活下去,可天不遂人愿,他注定将在这末法时代掀起波澜!成就一代影帝!谢千仇沉默地看着他…大师,你卦和书都拿倒了#玄学,从入门到放弃,入土,删库跑
- 最新章:第86章
- C语言实例教程(PDF格式)
- -Page 1-前 言Visual C+是开发运行于Windows 95和Windows NT环境下的Win32应用程序的可视化编程工具中最重要的成员之一,它为软件开发人员提供了完整的编辑、编译和调试工具和建立于Win32 API(ApplicationProgramming Interface)基
- 最新章:第143章
- 要你言听计从
- 作者:决明第一章哈士奇,没有护卫看家的本领,对主人、客人甚至是闯空门的恶人都一样友善,咬着皮球跟小偷一块玩你丢我捡也不用太惊讶,时常被人认为忠诚度不足。贺世祺背靠在冰冷玻璃落地窗前,一整间屋子都是伸手不见五指的黑暗,也好,反正他现在什么也不需要看到,只要耳朵还有听觉就好,顺便听听贴在耳边的手机里还要
- 最新章:第28章