当我们在处理一系列线程的时候,当数量达到一定量,在以前我们可能会选择使用NSOperationQueue来处理并发控制,但如何在GCD中快速的控制并发呢?答案就是dispatch_semaphore.

  信号量是一个整形值并且具有一个初始计数值,并且支持两个操作:信号通知和等待。当一个信号量被信号通知,其计数会被增加。当一个线程在一个信号量上等待时,线程会被阻塞(如果有必要的话),直至计数器大于零,然后线程会减少这个计数。
  在GCD中有三个函数是semaphore的操作,分别是:
  dispatch_semaphore_create   创建一个semaphore
  dispatch_semaphore_signal   发送一个信号
  dispatch_semaphore_wait    等待信号

  简单的介绍一下这三个函数,第一个函数有一个整形的参数,我们可以理解为信号的总量,dispatch_semaphore_signal是发送一个信号,自然会让信号总量加1,dispatch_semaphore_wait等待信号,当信号总量少于0的时候就会一直等待,否则就可以正常的执行,并让信号总量-1,根据这样的原理,我们便可以快速的创建一个并发控制来同步任务和有限资源访问控制

int data = 3;

__block int mainData = 0;

__block dispatch_semaphore_t sem = dispatch_semaphore_create(0);

dispatch_queue_t queue = dispatch_queue_create("StudyBlocks", NULL);

dispatch_async(queue, ^(void) {

int sum = 0;

for(int i = 0; i < 5; i++)

{

sum += data;

NSLog(@" >> Sum: %d", sum);

}

dispatch_semaphore_signal(sem);

});

dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);

for(int j=0;j<5;j++)

{

mainData++;

NSLog(@">> Main Data: %d",mainData);

}

dispatch_release(sem);

dispatch_release(queue);

输出:

2013-07-08 11:33:05.654 dispatch[1102:1e03]  >> Sum: 3

2013-07-08 11:33:05.656 dispatch[1102:1e03]  >> Sum: 6

2013-07-08 11:33:05.657 dispatch[1102:1e03]  >> Sum: 9

2013-07-08 11:33:05.658 dispatch[1102:1e03]  >> Sum: 12

2013-07-08 11:33:05.659 dispatch[1102:1e03]  >> Sum: 15

2013-07-08 11:33:05.660 dispatch[1102:c07] >> Main Data: 1

2013-07-08 11:33:05.660 dispatch[1102:c07] >> Main Data: 2

2013-07-08 11:33:05.660 dispatch[1102:c07] >> Main Data: 3

2013-07-08 11:33:05.661 dispatch[1102:c07] >> Main Data: 4

2013-07-08 11:33:05.661 dispatch[1102:c07] >> Main Data: 5

通过信号量就可以保证,Main Data 永远在Sum之后执行

GCD dispatch_semaphore相关推荐

  1. GCD 信号量控制并发 (dispatch_semaphore)

    2019独角兽企业重金招聘Python工程师标准>>> 当我们在处理一系列线程的时候,当数量达到一定量,在以前我们可能会选择使用NSOperationQueue来处理并发控制,但如何 ...

  2. GCD的其他(不常用)方法

    1. GCD的栅栏方法 dispatch_barrier_async 我们有时需要异步执行两组操作,而且第一组操作执行完之后,才能开始执行第二组操作.这样我们就需要一个相当于栅栏一样的一个方法将两组异 ...

  3. GDC dispatch_semaphore

    当我们在处理一系列线程的时候,当数量达到一定量,在以前我们可能会选择使用NSOperationQueue来处理并发控制,但如何在GCD中快速的控制并发呢?答案就是dispatch_semaphore, ...

  4. iOS之深入分析GCD的函数与队列以及多种组合使用

    一.GCD 简介 ① 什么是 GCD ? GCD 是 Apple 开发的一个多核编程的较新的解决方法: GCD 全称:Grand Central Dispatch,是纯 C 语言,提供非常多强大的函数 ...

  5. iOS 多线程:『GCD』详尽总结

    原文链接:www.jianshu.com/p/2d57c7201- 感谢大家对这篇文章的喜欢和支持.为了不辜负大家的喜欢,也为了更好的让大家了解 iOS 多线程,以及 GCD 的相关知识,我对这篇文章 ...

  6. 对GCD的一些理解和实践

    对GCD的一些理解和实践 GCD GCD,全程Grand Central Dispatch,是苹果为了多核并行提出的解决方案.它是使用C语言实现,但是由于用了block来处理回调,所以使用起来十分方便 ...

  7. 关于多线程之GCD的一些学习要点

    GCD是当前多线程使用最方便的,也是使用比较多的. 学习GCD主要集中在一下几点: 一.队列,同步,异步 1.主队列:dispatch_get_main_queue(); 2.串行队列:dispatc ...

  8. GCD(Grand Central Dispatch)

    1. GCD: 异步执行任务的技术之一,一般是将应用程序中记述的线程管理用代码在系统级实现,由于是系统级的管理,这样的话将有更好的线程效率. 2. 使用方法如下: dispatch_async(que ...

  9. IOS开发之多线程 -- GCD的方方面面

    前言:这篇GCD的博文是本人阅读了很多海内外大神的关于GCD的文章,以及结合之前自己对GCD的粗浅的认识,然后取其精华,去其槽粕,综合起来的笔记,而且是尽可能的以通熟易懂的并且是正确的理论论述方式呈现 ...

最新文章

  1. notepad++ php开发环境,Notepad++可以结合命令行来搭建各种编程环境
  2. BufferedReader
  3. 自己动手写一个单链表
  4. Alamofire源码导读二:发起请求及内部加锁的逻辑
  5. 如何知道mysql的地址_如何知道自己的计算机上mysql的地址?
  6. 计算机控制的点火系统由,第八节(点火系统)
  7. python拼接大量ts文件_Python爬取.ts文件,合并为mp4
  8. LeetCode 5235. 找出输掉零场或一场比赛的玩家(计数)
  9. word 职称计算机考试大纲,全国职称计算机考试Word2003大纲.doc
  10. linux io测试陈旭,130242014076+陈旭+第2次实验(示例代码)
  11. centos7.4 kubeadm安装Kubernetes 1.14.1 集群
  12. Flutter学习 — 给新页面传值
  13. Django Mysql数据库-聚合查询与分组查询
  14. 谷歌应用内购神器Freedom原理解析
  15. 录视频时帧数越高越好么?
  16. 系统设计系列之如何设计一个短链服务
  17. 数字经济是党和国家定下的重要发展战略
  18. python图像处理-形状提取和识别1(基于Hough的形状提取)
  19. 用 Windows Live Writer完美发布新浪、网易、blogcn、blogbus、cnblogs 博客2
  20. 像素、厘米、英寸之间的换算关系

热门文章

  1. 计算机还是数学竞赛内容吗,除了AMC,数学牛娃还能参加什么高含金量的数学竞赛...
  2. java 短链接实现方案_java利用百度短网址api实现URL长短互换工具类分享
  3. 数学知识巧学JCF(Java Collections framework)
  4. python之路——网络编程
  5. [UE4]解析json数据
  6. 硬件——STM32 , 录音
  7. GDB 修改当前判断函数的返回值(即修改寄存器的值)的方法
  8. 修改Linux网卡由eth1变成eth0
  9. 生成跨语言的类型声明和接口绑定的工具(Djinni )
  10. qt 配置的相对路径写法