1

いくつかのタスクを実行し、各スレッド間でしばらく待つためにdispatch_after、一緒に使用することに興味があります。dispatch_semaphore_t

私は次のコードを使用します:

dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, 3ull * NSEC_PER_SEC);

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_semaphore_t semaphore = dispatch_semaphore_create(1);

dispatch_after(time, queue, ^{

    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

    NSLog(@"blk01");

    dispatch_semaphore_signal(semaphore);

});

dispatch_after(time, queue, ^{

    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

    NSLog(@"blk02");

    dispatch_semaphore_signal(semaphore);

});

dispatch_after(time, queue, ^{

    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

    NSLog(@"blk03");

    dispatch_semaphore_signal(semaphore);

});

予想される遅延ではなく、3秒後にスレッドが実行されます。

私は何が間違っているのですか?各スレッド実行間の遅延時間でdispatch_semaphore_tでスレッドを実行する他の方法はありますか?

4

2 に答える 2

4

3 つのブロックを (同時にではなく) 連続して実行し、ブロック間で一時停止する場合は、セマフォを使用するよりも簡単な方法があります。最も簡単なのは、シリアル キューを作成し、各ブロックの先頭または末尾にsleep(または) を配置することです。usleep

dispatch_queue_t queue = dispatch_queue_create("my queue", 0);

dispatch_async(queue, ^{
    sleep(3);
    NSLog(@"blk01");
});

dispatch_async(queue, ^{
    sleep(3);
    NSLog(@"blk02");
});

dispatch_async(queue, ^{
    sleep(3);
    NSLog(@"blk03");
});

dispatch_release(queue);

ブロックを配置sleepするのは非常に簡単ですが、スレッドを結び付けます。多くのキューを作成してそれらの多くでスリープしない限り、それはおそらく問題になりません。

セマフォが必要だと思う理由を教えていただければ、適切な使用方法についてより良い代替案やアドバイスを提供できるかもしれません。

于 2012-09-07T03:46:52.210 に答える
3

あなたのコードは、各呼び出しの間に 3 秒の遅延を求めていません。3 つのブロックをすべて同時にスケジュールし、3 つのブロックすべてがセマフォとログを取得します。

後続の各ブロックのディスパッチに使用する時間を調整するか、dispatch_after()前の各呼び出し内から後続の呼び出しをスケジュールする必要があります。前者はおそらくより単純で、より正確なタイミングが得られます。後者を使用する場合はtime、各ブロックで必ず再計算してください。これは、相対時間ではなく絶対時間を参照するためです。

于 2012-09-07T03:05:55.767 に答える