上次简单学习了一下临界区,感觉有些自我陶醉,呵呵。今天就能加点难度(相对来说)——互斥量。互斥量的用途和临界区很像。它与临界区的差别在于可以跨线程使用,可以用来同步进行多个线程间的数据访问,但是是以牺牲速度为代价的。前面说过了,只有临界区是非核心对象,那么互斥量就是一个核心对象了。核心对象的特点是有所谓的引用计数。所著一个未被拥有的互斥量,比锁住一个未被拥有的临界区需要花费几乎100倍的时间(数据引用自《Visual C++ 6.0编程学习捷径》)。
Win32 API有一套互斥量的支持函数:
/**/
/** / brief 创建互斥量.
* @param lpMutexAttributes 指定安全属性,NULL表示使用默认的属性.
* @param bInitialOwner 指出创建互斥量的线程是否要成为该互斥量的最初拥有.
* TRUE表示拥有,因此互斥量将处于无信号状态.
* FALSE表示互斥量不被任何现成拥有,因此处于有信号状态.
* @param lpName为NULL或标识该互斥量的一个字符串的地址,任何进程或线程都可以根据此名称使用该互斥量.
* 当应用程序调用CreateMutex()函数时,系统分配一个互斥量的核心对象,把它的名字设为lpName所致的字符串.
* 该名字在进程间共享互斥量。CreateMutex()返回一个标识新互斥量对象的进程相关的句柄.
*/
HANDLE CreateMutex(LPSECURITY_ATTRIBUTES lpMutexAttributes, BOOL bInitialOwner,
LPCTSTR lpName);
/**/ /** / brief 打开互斥量.
* @param dwDesiredAccess 可设置为MUTEX_ALL_ACCESS或SYNCHRONIZE.
* @param bInheritHandle 指出该进程创建的子进程能否继承该互斥量.
* @param lpName 指定互斥量的名字.
*/
HANDLE OpenMutex(DWORD dwDesiredAccess, BOOL bInheritHandle, LPCTSTR lpName);
/**/ /** / brief 释放互斥量.
* @param hMutex 要释放的互斥量的句柄.
*/
BOOL ReleaseMutex(HANDLE hMutex);
* @param lpMutexAttributes 指定安全属性,NULL表示使用默认的属性.
* @param bInitialOwner 指出创建互斥量的线程是否要成为该互斥量的最初拥有.
* TRUE表示拥有,因此互斥量将处于无信号状态.
* FALSE表示互斥量不被任何现成拥有,因此处于有信号状态.
* @param lpName为NULL或标识该互斥量的一个字符串的地址,任何进程或线程都可以根据此名称使用该互斥量.
* 当应用程序调用CreateMutex()函数时,系统分配一个互斥量的核心对象,把它的名字设为lpName所致的字符串.
* 该名字在进程间共享互斥量。CreateMutex()返回一个标识新互斥量对象的进程相关的句柄.
*/
HANDLE CreateMutex(LPSECURITY_ATTRIBUTES lpMutexAttributes, BOOL bInitialOwner,
LPCTSTR lpName);
/**/ /** / brief 打开互斥量.
* @param dwDesiredAccess 可设置为MUTEX_ALL_ACCESS或SYNCHRONIZE.
* @param bInheritHandle 指出该进程创建的子进程能否继承该互斥量.
* @param lpName 指定互斥量的名字.
*/
HANDLE OpenMutex(DWORD dwDesiredAccess, BOOL bInheritHandle, LPCTSTR lpName);
/**/ /** / brief 释放互斥量.
* @param hMutex 要释放的互斥量的句柄.
*/
BOOL ReleaseMutex(HANDLE hMutex);