GCD semaphore信号量

dispatch_semaphore_create :

查看文档 发现只有三个 API:

  • dispatch_semaphore_create(long value);
  • dispatch_semaphore_wait(dispatch_semaphore_t dsema,dispatch_time_t timeout);
  • dispatch_semaphore_signal(dispatch_semaphore_t dsema);

创建semaphore

long count = 1;
dispatch_semaphore_t lock = dispatch_semaphore_create(count);
传入的信号量参数count必须大于或者等于0,否则lock为Null,可以把信号量count理解为支持的最大并发线程个数

注意,当lock为成员变量或属性时,有线程在等待执行的话,根据超时时间self 会延迟或者永远(DISPATCH_TIME_FOREVER)不会释放。

等待信号

long wait = dispatch_semaphore_wait(lock, 
              dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)));
第二个参数为等待的时间,这里是等待2秒。
执行这个API会判断当前的信号量count是否大于0,大于0则继续执行,并且信号量count-1,否则等待超时时间或信号量+1。

发信号

long signal = dispatch_semaphore_signal(lock);
信号量count+1;返回值=0,表示没有任务在等待执行,否则表示有任务在等待执行。(当线程有优先级时,唤醒优先级最高的线程;否则随机唤醒)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容