对于某个项目,我必须在pthread中使用静态互斥初始化程序。但是我的库也应该在Windows上可移植。
pthread_mutex_t csapi_mutex = PTHREAD_MUTEX_INITIALIZER;
Windows上是否存在相应的静态初始化程序。?
感谢。
答案 0 :(得分:4)
Pthreads-win32应该为这样的结构提供非常好的支持。但我没有检查过。
答案 1 :(得分:1)
我想出了这个与pthread兼容的互斥操作的端口:
#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()。