Jay*_*Jay 6 windows mutex pthreads
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;
}
Run Code Online (Sandbox Code Playgroud)
基本上,您希望在第一次使用锁时初始化以原子方式发生.如果两个线程进入if-body,则只有一个成功初始化锁.请注意,静态锁的生命周期不需要CloseHandle().
不可以,由于 Windows 互斥体是句柄,因此必须使用 来初始化它们CreateMutex()。
请注意,pthread_mutex_t使用的静态初始化不是真正的init,它将在第一次调用或PTHREAD_MUTEX_INITIALIZER时在内部完成pthread_mutex_lock()pthread_mutex_trylock()
| 归档时间: |
|
| 查看次数: |
2477 次 |
| 最近记录: |