如何设置dispatch_semaphore_t的上限

时间:2014-04-30 03:47:21

标签: ios semaphore

我刚才意识到没有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);
  }

1 个答案:

答案 0 :(得分:0)

无法设置dispatch_semaphore_t的上限。实施最可能相当原始。按返回值,它可能在内部使用long,因此上限可能是LONG_MAX。这个long原子地增加或减少,任何不会导致long低于零的减少都会导致成功操作,否则long会再次增加被封锁了。一旦被阻止,它就会被超时唤醒,如果已经设置了一个,导致操作失败并超时,或者每当long被某个其他线程原子地增加时它就会被唤醒,从而导致代码再试一次。此尝试也可能失败,这可能发生,因为两个等待的线程可以被唤醒并同时运行,在这种情况下,一个将更快,另一个将再次阻塞并仍然等待超时或另一个增加。如果你需要除了相当原始的API之外的任何东西,你需要构建自己的信号量,这是基于NSLock和原始计数器做的一件相当容易的事情。