2011-07-12 145 views
1

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

pthread_mutex_t csapi_mutex = PTHREAD_MUTEX_INITIALIZER; 

在windows上是否存在腐蚀性静态初始值设定项?

谢谢。

+0

是的,PTHREAD_MUTEX_INITIALIZER。 –

+0

这是否意味着相同的代码将在Windows上工作? – liv2hak

+0

如果你打算在windows上使用pthreads,是的。但是要在窗口上使用pthreads,你需要Cygwin –

回答

1

我想出了这个端口并行线程兼容的互斥操作:

#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()。