GCD 信号量 dispatch_semaphore

Dispatch Semaphore信号量是一种持有计数的信号,实际开发中主要用于保持线程同步,将异步任务转为同步执行。

关键函数如下:

  1. dispatch_semaphore_create 创建一个Semaphore并初始化信号的总量
  2. dispatch_semaphore_signal 发送一个信号,让信号总量+1
  3. dispatch_semaphore_wait 可以使总信号量-1,当信号总量为0时就会一直等待(阻塞所在进程),否则正常执行

线程同步

我们知道异步执行耗时操作是不作任何等待的,那如果在这个基础上我们又需要使用异步执行得到的结果进行另外一些额外操作时就需要使用线程同步来实现。

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);

__block int a = 0;
dispatch_async(queue, ^{
   //追加任务
    NSLog(@"执行任务");   
    number = 10;
    
    dispatch_semaphore_signal(semaphore);
});

dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

NSLog(@"end, a = %zd", a);

控制台输出:

执行任务
end, a = 10

这里异步将任务追加到队列后,执行dispatch_semaphore_wait但是此时总信号量semaphore = 0,因此当前线程会进入等待状态。接着异步赋值操作真正执行完毕后调用dispatch_semaphore_signal使总信号量semaphore = 1,被阻塞的线程恢复并继续往下执行并打印“end, a= 10”到这里就已实现线程同步,异步线程操作被转换为同步执行。

如果本文对你有帮助记得点个喜欢哈

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.GCD信号量简介 GCD信号量机制主要涉及到以下三个函数: dispatch_semaphore_create...
    VV木公子阅读 41,268评论 18 230
  • 关于信号量信号量:就是一种可用来控制访问资源的数量的标识,设定了一个信号量,在线程访问之前,加上信号量的处理,则可...
    real潘阅读 5,439评论 5 13
  • 文用来介绍 iOS 多线程中 GCD 的相关知识以及使用方法。通过本文,您将了解到: 1. GCD 简介 2. G...
    晓_我想去环游世界阅读 4,834评论 2 8
  • 参加一项业务培训,来到二十多年前就读过的警校。 经过大手笔的改扩建,几乎不敢相认这个曾经让我们无数次想要逃离但毕业...
    杏仁1阅读 3,283评论 10 9
  • 出现了一个很奇怪的现象,总感觉要等到夜阑人静,才真的可以下手写点儿文字! 一直以来,貌似我还仗着自己尚且年轻,总是...
    司马晓筱阅读 1,873评论 0 4

友情链接更多精彩内容