如何确定是否正在等待调度信号量?

时间:2013-04-03 22:21:53

标签: ios objective-c multithreading grand-central-dispatch semaphore

如何确定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];
        });
    });

1 个答案:

答案 0 :(得分:5)

dispatch_semaphore_wait()仅在信号量值返回0时才递减。

如果超时到期(即它返回非零),则信号量值没有减少。

将成功案例中的减量视为取得计数信号量管理的其中一个资源的所有权,如果您在等待成功后立即发出信号,则表示您已经停止使用该资源,这可能是不是你想要的。

你想做什么?