CreateMutex
作用
用来创建一个有名或无名的互斥量对象,可用于线程锁/进程锁。
原型
HANDLE CreateMutexA(
[in, optional] LPSECURITY_ATTRIBUTES lpMutexAttributes,
[in] BOOL bInitialOwner,
[in, optional] LPCSTR lpName
);
参数说明
- lpMutexAttributes,指向安全属性的指针。指定为NULL时,不允许被继承。
- bInitialOwner,初始化互斥对象的所有者。如创建进程希望立即拥有互斥体,则设为TRUE,一般为 FALSE 。
- lpName,指向互斥对象名的指针。对象名可以有“Global"或"Local"前缀,以显式地在全局或会话名称中创建对象。禁止使用”\"符号。
扩展
linux平台中,一般使用pthread库中的pthread_mutex_t对象实现类似机能。
pthread_mutex_init
pthread_mutex_lock
pthread_mutex_trylock
pthread_mutex_unlock
pthread_mutex_destroy
不考虑平台兼容的问题,还可以使用C/C++ 11中的mtx_t或者std::mutex。
简单示例
class Locker {
public:
Locker() { ; }
~Locker() { ; }
bool lock();
bool unlock();
};
#ifdef WIN32
HANDLE mp_mutex = NULL;
#else
pthread_mutex_t mp_mutex = PTHREAD_MUTEX_INITIALIZER;
#endif
bool Locker::lock() {
#ifdef WIN32
mp_mutex = OpenMutex(SYNCHRONIZE, NULL, "heapMutex");
if (mp_mutex == NULL) {
mp_mutex = CreateMutex(NULL, FALSE, "heapMutex");
if (mp_mutex == NULL) {
;
}
return (0 == WaitForSingleObject(mp_mutex, INFINITE));
}
return false;
#else
return (0 == pthread_mutex_lock(&mp_mutex));
#endif
}
bool Locker::unlock() {
#ifdef WIN32
if (ReleaseMutex(mp_mutex))
return CloseHandle(mp_mutex);
else
return false;
#else
return (0 == pthread_mutex_unlock(&mp_mutex));
#endif
}