對於某個項目,我必須在pthread中使用靜態互斥體初始化程序。但是,我的庫也應該可以在Windows上移植。在Windows上的Linux pthread可移植性
pthread_mutex_t csapi_mutex = PTHREAD_MUTEX_INITIALIZER;
在windows上是否存在腐蝕性靜態初始值設定項?
謝謝。
對於某個項目,我必須在pthread中使用靜態互斥體初始化程序。但是,我的庫也應該可以在Windows上移植。在Windows上的Linux pthread可移植性
pthread_mutex_t csapi_mutex = PTHREAD_MUTEX_INITIALIZER;
在windows上是否存在腐蝕性靜態初始值設定項?
謝謝。
我想出了這個端口並行線程兼容的互斥操作:
#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()。
Pthreads-win32應該爲這樣的結構提供很好的支持。但我沒有檢查。
是的,PTHREAD_MUTEX_INITIALIZER。 –
這是否意味着相同的代碼將在Windows上工作? – liv2hak
如果你打算在windows上使用pthreads,是的。但是要在窗口上使用pthreads,你需要Cygwin –