8

dispatch_semaphore_tが待機していないかどうかを判断するにはどうすればよいですか? 私は最初に考えていました:

if ( dispatch_semaphore_wait(mySemaphore, DISPATCH_TIME_NOW) ) {
    NSLog(@"No more resources, wait");
} else {
    NSLog(@"Resources available, shouldn't wait");
}

dispatch_semaphore_wait()しかし、セマフォを実行する行為は減分されるので、私は考えていました:

if ( dispatch_semaphore_wait(mySemaphore, DISPATCH_TIME_NOW) ) {
    NSLog(@"No more resources, wait");
} else {
    dispatch_semaphore_signal(mySemaphore);
    NSLog(@"Resources available, shouldn't wait");
}

セマフォをデクリメントしないという最終結果をもたらすのはどれですか?

編集

自分が何をしているのか、どのようにしてこの結論に至ったのかをタイプしていると、解決策について実際に間違った方法で考えていたことに気付きました。リソースを待っているかどうかを知りたかっただけで、「ユーザーへのダイアログ。これが正しい方法だと思います:

    [self showWait];
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        dispatch_semaphore_wait(mySemaphore, DISPATCH_TIME_FOREVER);
        dispatch_async(dispatch_get_main_queue(), ^{
            [self hideWait];
        });
    });
4

1 に答える 1

4

dispatch_semaphore_wait()0 を返す場合にのみ、セマフォ値をデクリメントしています。

タイムアウトの期限が切れた場合 (つまり、0 以外の値が返された場合)、セマフォ値は減分されていません。

成功の場合の減少は、カウンティング セマフォによって管理されているリソースの 1 つの所有権を取得することと考えてください。待機が成功した直後にシグナルを送信した場合、そのリソースの使用をすぐに停止したことを示します。欲しいです。

あなたは何をしようとしているのですか ?

于 2013-04-03T23:08:10.983 に答える