3

セマフォが 0 より大きい値で作成されたときに、dispatch_semaphore_wait(..) を使用すると問題が発生します

sema = dispatch_semaphore_create(2);
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    //signals here
});

dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
dispatch_release(sema);

待機は 2 つのシグナルを待機する必要がありますか? 上記のコードでは、まったく待機しないため、リリースが呼び出され、結果としてクラッシュします!

4

2 に答える 2

6

この動作を得るには、セマフォの代わりにディスパッチ グループを使用します。

dispatch_group_enter()タスクを開始する前に 2 回呼び出してグループをサイズ 2 に初期化し、 2 回dispatch_group_wait()の呼び出しを待ってdispatch_group_leave()から戻ります。

于 2013-06-12T19:50:34.860 に答える
4

いいえ、そうではありません。スレッドは、前の 2 つのいずれかが通知されるまで、3 回目の待機でブロックされます。一度にリソースにアクセスできるスレッド数を指定するシステムです。詳細はこちら

あなたが説明した方法で待ちたい場合は、NSConditionクラスを使用できると思います。

于 2013-06-12T09:44:03.147 に答える