5

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

尚未递减信号量的最终结果,但是看起来像一个黑客,建议?

编辑

由于我打字了我在做什么,我是如何来到这个结论,我意识到,我确实想解决的方法不对,我只是想知道,如果我是等待资源并能够向用户显示“等待”对话框。我觉得这是做了正确方式

+1

这是无法完成的(至少不可靠),并且您想要这样做的事实表明设计错误。我加入@das问道:你在高度抽象层面上想做什么?什么情况会让你觉得你想知道信号量是否在等待? – 2013-04-03 23:24:35

+0

@KenThomases你说得对,我以错误的方式来到这里,我编辑了更好的解决方案。 – Shizam 2013-04-03 23:38:44

回答

4

dispatch_semaphore_wait()如果它返回0

只递减信号量的值如果超时期满(即它返回非零值)时,信号值没有减少。

将成功案例中的减量看作是获取由计数信号量管理的资源之一的所有权,如果在成功等待后立即发出信号,则表示您已立即停止使用该资源,即想必不是你想要的。

你想做什么?

+0

将此标记为解决方案,因为@ das的陈述是正确的,并且我以这种错误方式进入:) – Shizam 2013-04-03 23:39:36

+1

为什么地球上不能为dispatch_semaphore_wait()指定此行为 - 它完全没有提到信号值如果超时已过并且资源已被占用,则不会减量。然而,优秀的答案 - 我可以证实这种情况,信号量递减只发生在对'DISPATCH_TIME_NOW'返回0的测试中。在非零情况下,您不需要'dispatch_semaphore_signal()'。谢谢! – 2013-07-03 10:46:55

+0

@ rob-glassey在这一点上没有证据表明文档不足,请提交[bug](http://bugreport.apple.com)! – das 2013-07-03 22:14:26