web-dev-qa-db-ja.com

OS Xのsem_init

私は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を呼び出しても変化しません。

53
Nippysaurus

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

名前なしセマフォの代わりに名前付きセマフォを使用するには、sem_openの代わりにsem_initを使用し、sem_closeの代わりにsem_unlinkおよびsem_destroyを使用します。

86
Nippysaurus

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

ヘッダーファイルは十分に文書化されており、非常に使いやすいことがわかりました。

18
Jess Bowers