私はpthreadとセマフォライブラリを使用するいくつかのコードに取り組んでいます。 sem_init
関数は私のUbuntuマシンで正常に動作しますが、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
を呼び出しても変化しません。
名前のないセマフォはサポートされていません。名前付きセマフォを使用する必要があります。
名前なしセマフォの代わりに名前付きセマフォを使用するには、sem_open
の代わりにsem_init
を使用し、sem_close
の代わりにsem_unlink
およびsem_destroy
を使用します。
OS Xの名前付きセマフォよりも優れたソリューション(最近)は、Grand Central Dispatchのdispatch_semaphore_tです。名前のないPOSIXセマフォと非常によく似ています。
セマフォを初期化します。
#include <dispatch/dispatch.h>
dispatch_semaphore_t semaphore;
semaphore = dispatch_semaphore_create(1); // init with value of 1
待機して投稿(シグナル):
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
...
dispatch_semaphore_signal(semaphore);
破壊:
dispatch_release(semaphore);
ヘッダーファイルは十分に文書化されており、非常に使いやすいことがわかりました。