2009-09-11 13 views
47

私は、pthreadとsemaphoreのライブラリを使用するいくつかのコードに取り組んでいます。 sem_init関数は私のubuntuマシンで正常に動作しますが、OS Xではsem_init関数は全く効果がありません。ライブラリに何か問題がありますか、それを行う別の方法がありますか?これはテストに使用しているコードです。OS_X上のsem_init

sem_t sem1; 
sem_t sem2; 
sem_t sem3; 
sem_t sem4; 
sem_t sem5; 
sem_t sem6; 

sem_init(&sem1, 1, 1); 
sem_init(&sem2, 1, 2); 
sem_init(&sem3, 1, 3); 
sem_init(&sem4, 1, 4); 
sem_init(&sem5, 1, 5); 
sem_init(&sem6, 1, 6); 

値は乱数で表示され、sem_initコールの後で変更されません。

+3

'sem_init'の戻り値をテストする必要があります。 – bfontaine

+0

少なくとも、Mac OS XのYosemite(10.10)では、 'sem_init()'、 'sem_destroy()'、 'sem_getvalue()'は '非推奨 'とマークされ、結果としてコンパイラの警告を生成することに注意してください。 –

+0

@JonathanLeffler Oh、no。 Mac OS X Yosemite(10.10.1)では動作しません。 – vipygd

答えて

77

無名セマフォはサポートされていません。名前付きセマフォを使用する必要があります。

は、代わりに無名のセマフォの名前付きセマフォを使用する代わりに sem_initsem_openを使用し、 sem_closesem_unlinkの代わり sem_destroyを使用します。

+32

うわー。 ''は 'sem_init'を宣言してOS X上で正しくコンパイルするが、' errno'を 'ENOSYS'(関数は実装されていない)に設定して-1を返す。 –

+0

今、私はC++ブーストライブラリを使ってセマフォの良い例を探しています。 – jcpennypincher

+0

sem_getvalue()はどちらも動作しません...... http://stackoverflow.com/questions/16655153/sem-getvalue-dysfunctionality-in-mac-osを参照してください。 -xc/16655541#16655541 – user454322

15

OS Xの名前付きセマフォよりも優れたソリューション(最近)は、Grand Central Dispatchのdispatch_semaphore_tです。これは、無名のPOSIXセマフォと非常によく似ています。破壊

dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); 
... 
dispatch_semaphore_signal(semaphore); 

#include <dispatch/dispatch.h> 
dispatch_semaphore_t semaphore; 
semaphore = dispatch_semaphore_create(1); // init with value of 1 

する&ポストを待って(信号):

セマフォを初期化し

dispatch_release(semaphore); 

ヘッダファイルは、十分に文書化し、私はそれが非常に簡単発見されました使用する。

+0

GCDセマフォはGCDレベルの機能です。理論的には、pthreadレベルと組み合わせると問題が生じる可能性があります。 – Eonil

関連する問題