2011-07-12 14 views
1

特定のプロジェクトでは、pthread.iniに静的なmutex初期化子を使用する必要があります。私のライブラリはWindowsでも移植可能であると考えられています。ウィンドウでのLinuxのpthreadの移植性

pthread_mutex_t csapi_mutex = PTHREAD_MUTEX_INITIALIZER; 

窓には腐食性の静的イニシャライザがありますか?

ありがとうございました。

+0

はい、PTHREAD_MUTEX_INITIALIZER。 –

+0

これは同じコードがウィンドウで機能することを意味しますか? – liv2hak

+0

Windows上でpthreadを使用する場合は、yesを入力します。しかし、Windowsでpthreadを使用するには、Cygwin –

答えて

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; 
} 

は基本的に、あなたはロックが初めて使用されたときに初期化がアトミックに起こるしたいです。 2つのスレッドがif-bodyに入ると、ロックの初期化に成功するのは1つだけです。静的ロックの存続期間のためにCloseHandle()を行う必要はないことに注意してください。

4

Pthreads-win32は、そのような構築物を非常に良好に支持するはずである。しかし、私はチェックしていない。

関連する問題