【发布时间】:2010-08-24 11:18:32
【问题描述】:
pthread 支持使用 PTHREAD_MUTEX_INITIALIZER 对 pthread_mutex_t 进行静态初始化。
是否可以使用 Windows 互斥锁实现类似的互斥锁初始化静态机制?
【问题讨论】:
pthread 支持使用 PTHREAD_MUTEX_INITIALIZER 对 pthread_mutex_t 进行静态初始化。
是否可以使用 Windows 互斥锁实现类似的互斥锁初始化静态机制?
【问题讨论】:
是的,这可以通过几行代码来实现。这是 pthread 兼容互斥操作的一个端口,包括您想要的静态初始化程序 MUTEX_INITIALIZER:
#define MUTEX_TYPE HANDLE
#define MUTEX_INITIALIZER NULL
#define MUTEX_SETUP(x) (x) = CreateMutex(NULL, FALSE, NULL)
#define MUTEX_CLEANUP(x) (CloseHandle(x) == 0)
#define MUTEX_LOCK(x) emulate_pthread_mutex_lock(&(x))
#define MUTEX_UNLOCK(x) (ReleaseMutex(x) == 0)
int emulate_pthread_mutex_lock(volatile MUTEX_TYPE *mx)
{ if (*mx == NULL) /* static initializer? */
{ HANDLE p = CreateMutex(NULL, FALSE, NULL);
if (InterlockedCompareExchangePointer((PVOID*)mx, (PVOID)p, NULL) != NULL)
CloseHandle(p);
}
return WaitForSingleObject(*mx, INFINITE) == WAIT_FAILED;
}
基本上,您希望在第一次使用锁时自动进行初始化。如果两个线程进入 if-body,那么只有一个线程成功初始化了锁。请注意,静态锁的生命周期不需要 CloseHandle()。
【讨论】:
不,因为 Windows 互斥锁是句柄,它们必须用 CreateMutex() 初始化。
请注意,使用PTHREAD_MUTEX_INITIALIZER 对pthread_mutex_t 的静态初始化并不是真正的初始化,它会在第一次调用pthread_mutex_lock() 或pthread_mutex_trylock() 时在内部完成
【讨论】: