我刚刚意识到没有接口来设置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);
}发布于 2018-02-21 01:35:08
不可能为dispatch_semaphore_t设置上限。其实现很可能相当原始。根据返回值,它可能在内部使用了long,因此上限可能是LONG_MAX。这个long被原子地增加或减少,任何不会导致long低于零的减少都会导致成功的操作,否则long会再次增加,线程会被阻塞。一旦被阻塞,它要么被超时唤醒(如果设置了超时),导致操作因超时而失败,要么每次long被其他线程原子地增加时被唤醒,导致代码再次尝试。这种尝试也可能失败,这可能是因为两个等待线程可以被唤醒并同时运行,在这种情况下,一个线程将更快,另一个线程将再次阻塞,并仍然等待超时或另一次增加。如果您需要相当原始的API之外的任何东西,那么您需要构建自己的信号量,这是基于NSLock和一个原始计数器可以非常容易地完成的事情。
https://stackoverflow.com/questions/23379324
复制相似问题