首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何设置dispatch_semaphore_t的上限

如何设置dispatch_semaphore_t的上限
EN

Stack Overflow用户
提问于 2014-04-30 11:47:21
回答 1查看 273关注 0票数 0

我刚刚意识到没有接口来设置dispatch_semaphore_t的上限,我希望信号量的上限可以是1,即使我给信号量发了过多的信号,等待仍然可以工作,但是我测试了下面的代码,等待不起作用,有人能告诉我如何设置dispatch_semaphore_t的上限吗?

代码语言:javascript
复制
  - (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);
  }
EN

回答 1

Stack Overflow用户

发布于 2018-02-21 01:35:08

不可能为dispatch_semaphore_t设置上限。其实现很可能相当原始。根据返回值,它可能在内部使用了long,因此上限可能是LONG_MAX。这个long被原子地增加或减少,任何不会导致long低于零的减少都会导致成功的操作,否则long会再次增加,线程会被阻塞。一旦被阻塞,它要么被超时唤醒(如果设置了超时),导致操作因超时而失败,要么每次long被其他线程原子地增加时被唤醒,导致代码再次尝试。这种尝试也可能失败,这可能是因为两个等待线程可以被唤醒并同时运行,在这种情况下,一个线程将更快,另一个线程将再次阻塞,并仍然等待超时或另一次增加。如果您需要相当原始的API之外的任何东西,那么您需要构建自己的信号量,这是基于NSLock和一个原始计数器可以非常容易地完成的事情。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23379324

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档