HANDLE CreateMutex( LPSECURITY_ATTRIBUTES lpMutexAttributes, // 安全属性结构指针,可为NULL BOOL bInitialOwner, //是否占有该互斥量,TRUE:占有,FALSE:不占有 LPCTSTR lpName //信号量的名称 );
Mutex是核心对象,可以跨进程访问,下面的代码给出了从另一进程访问命名Mutex的例子:
HANDLE hMutex; hMutex = OpenMutex(MUTEX_ALL_ACCESS, FALSE, L\if (hMutex){ … } else{ … }
相关API:
BOOL WINAPI ReleaseMutex( HANDLE hMutex );
使用互斥编程的一般方法是:
void UpdateResource() { WaitForSingleObject(hMutex,…); ...//do something ReleaseMutex(hMutex); }
互斥(mutex)内核对象能够确保线程拥有对单个资源的互斥访问权。互斥对象的行为特性与临界区相同,但是互斥对象属于内核对象,而临界区则属于用户方式对象,因此这导致mutex与Critical Section的如下不同:
(1) 互斥对象的运行速度比关键代码段要慢;
(2) 不同进程中的多个线程能够访问单个互斥对象; (3) 线程在等待访问资源时可以设定一个超时值。
下图更详细地列出了互斥与临界区的不同: