Linux上的pthread可移植性

时间:2011-07-12 23:43:15

标签: windows linux pthreads

对于某个项目,我必须在pthread中使用静态互斥初始化程序。但是我的库也应该在Windows上可移植。

pthread_mutex_t csapi_mutex = PTHREAD_MUTEX_INITIALIZER;

Windows上是否存在相应的静态初始化程序。?

感谢。

2 个答案:

答案 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()。