我刚才意识到没有API来设置dispatch_semaphore_t的上限,我希望信号量上限可以是1,即使我过度信号通知信号量,等待仍然可以工作,但我测试了下面的代码,等待不起作用,有人能告诉我如何设置dispatch_semaphore_t的上限吗?
- (dispatch_semaphore_t)taskSemaphore {
if (!_taskSemaphore) {
_taskSemaphore = dispatch_semaphore_create(1);
}
return _taskSemaphore;
}
- (void)testMethod {
dispatch_semaphore_signal([self taskSemaphore]);
dispatch_semaphore_signal([self taskSemaphore]);
dispatch_semaphore_signal([self taskSemaphore]);
dispatch_semaphore_signal([self taskSemaphore]);
dispatch_semaphore_signal([self taskSemaphore]);
dispatch_semaphore_wait([self taskSemaphore], DISPATCH_TIME_FOREVER);
dispatch_semaphore_wait([self taskSemaphore], DISPATCH_TIME_FOREVER);
dispatch_semaphore_wait([self taskSemaphore], DISPATCH_TIME_FOREVER);
}
答案 0 :(得分:0)
无法设置dispatch_semaphore_t
的上限。实施最可能相当原始。按返回值,它可能在内部使用long
,因此上限可能是LONG_MAX
。这个long
原子地增加或减少,任何不会导致long
低于零的减少都会导致成功操作,否则long
会再次增加被封锁了。一旦被阻止,它就会被超时唤醒,如果已经设置了一个,导致操作失败并超时,或者每当long
被某个其他线程原子地增加时它就会被唤醒,从而导致代码再试一次。此尝试也可能失败,这可能发生,因为两个等待的线程可以被唤醒并同时运行,在这种情况下,一个将更快,另一个将再次阻塞并仍然等待超时或另一个增加。如果你需要除了相当原始的API之外的任何东西,你需要构建自己的信号量,这是基于NSLock
和原始计数器做的一件相当容易的事情。