是否可以在Windows中对互斥锁进行静态初始化?

时间:2010-08-24 11:18:33

标签: windows pthreads mutex

pthread支持使用PTHREAD_MUTEX_INITIALIZER静态初始化pthread_mutex_t。

是否可以使用Windows互斥锁实现互斥初始化的类似静态机制?

2 个答案:

答案 0 :(得分:7)

是的,这可以通过几行代码实现。这是一个与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()。

答案 1 :(得分:2)

不,由于Windows互斥锁是句柄,因此必须使用CreateMutex()初始化它们。

请注意,使用PTHREAD_MUTEX_INITIALIZER的pthread_mutex_t的静态初始化不是真正的初始化,它将在第一次调用pthread_mutex_lock()pthread_mutex_trylock()时在内部完成