2019独角兽企业重金招聘Python工程师标准>>>

当我们在处理一系列线程的时候,当数量达到一定量,在以前我们可能会选择使用NSOperationQueue来处理并发控制,但如何在GCD中快速的控制并发呢?答案就是dispatch_semaphore,对经常做unix开发的人来讲,我所介绍的内容可能就显得非常入门级了,信号量在他们的多线程开发中再平常不过了。
  信号量是一个整形值并且具有一个初始计数值,并且支持两个操作:信号通知和等待。当一个信号量被信号通知,其计数会被增加。当一个线程在一个信号量上等待时,线程会被阻塞(如果有必要的话),直至计数器大于零,然后线程会减少这个计数。
  在GCD中有三个函数是semaphore的操作,分别是:
  dispatch_semaphore_create   创建一个semaphore
  dispatch_semaphore_signal   发送一个信号
  dispatch_semaphore_wait    等待信号
   简单的介绍一下这三个函数,第一个函数有一个整形的参数,我们可以理解为信号的总量,dispatch_semaphore_signal是发送一个信 号,自然会让信号总量加1,dispatch_semaphore_wait等待信号,当信号总量少于0的时候就会一直等待,否则就可以正常的执行,并让 信号总量-1,根据这样的原理,我们便可以快速的创建一个并发控制来同步任务和有限资源访问控制。

dispatch_group_t group = dispatch_group_create();
    dispatch_semaphore_t semaphore = dispatch_semaphore_create(10);
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    for (int i = 0; i < 100; i++)
    {
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
        dispatch_group_async(group, queue, ^{
            NSLog(@"%i",i);
            sleep(2);
            dispatch_semaphore_signal(semaphore);
        });
    }
    dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
    dispatch_release(group);
    dispatch_release(semaphore);

 简单的介绍一下这一段代码,创建了一个初使值为10的semaphore,每一次for循环都会创建一个新的线程,线程结束的时候会发送一个信号,线程 创建之前会信号等待,所以当同时创建了10个线程之后,for循环就会阻塞,等待有线程结束之后会增加一个信号才继续执行,如此就形成了对并发的控制,如 上就是一个并发数为10的一个线程队列。

转载于:https://my.oschina.net/u/2418271/blog/749190

GCD 信号量控制并发 (dispatch_semaphore)相关推荐

  1. python3 异步 semaphore 信号量 控制并发

    使用代码如下 from aiohttp import ClientSession import asyncio# 限制协程并发量 async def hello(sem, url):async wit ...

  2. JAVA线程并发数量控制_线程同步工具(二)控制并发访问多个资源

    声明:本文是< Java 7 Concurrency Cookbook>的第三章, 作者: Javier Fernández González 译者:郑玉婷 控制并发访问多个资源 在并发访 ...

  3. 【nodejs爬虫】使用async控制并发写一个小说爬虫

    最近在做一个书城项目,数据用爬虫爬取,百度了一下找到这个网站,以择天记这本小说为例. 爬虫用到了几个模块,cheerio,superagent,async. superagent是一个http请求模块 ...

  4. WCF 第五章 控制并发调用的数量

    当InstancingMode设置成Single时,WCF在宿主内创建一个单一的实 例,不考虑有多少客户端被创建.当ConcurrencyMode设置成Multiple时,WCF为每个请求创建一个线程 ...

  5. 如何控制并发和控制死锁(内含pb的处理要点)

    锁的概述 一. 为什么要引入锁 多个用户同时对数据库的并发操作时会带来以下数据不一致的问题: 丢失更新 A,B两个用户读同一数据并进行修改,其中一个用户的修改结果破坏了另一个修改的结果,比如订票系统 ...

  6. 用GCD线程组与GCD信号量将异步线程转换为同步线程

    用GCD线程组与GCD信号量将异步线程转换为同步线程 有时候我们会碰到这样子的一种情形: 同时获取两个网络请求的数据,但是网络请求是异步的,我们需要获取到两个网络请求的数据之后才能够进行下一步的操作, ...

  7. (原创)使用TimeStamp控制并发问题[示例]-.cs脚本

    TimeStamp.aspx.cs代码(C#),已调试通过:   1using System;   2using System.Collections;   3using System.Compone ...

  8. Nodejs - 如何用 eventproxy 模块控制并发

    本文目标 本文的目标是获取 ZOJ 1001-1010 每道题 best solution 的作者 id,取得数据后一次性输出在控制台. 前文 如何用 Nodejs 分析一个简单页面 我们讲了如何用 ...

  9. linux控制并发运行进程数

    linux控制并发运行进程数,可以使用重定向. 代码示范如下: tmp_file="/tmp/$$.fifo" mkfifo $tmp_file exec 6<>$tm ...

最新文章

  1. nanomsg:ZeroMQ作者用C语言新写的消息队列库
  2. java获取24小时制时间格式_java 日期格式时间24小时制
  3. python详细安装步骤-Pycharm及python安装详细教程(图解)
  4. 读取文件夹下所有的文件
  5. 2 年来,每个人最该感谢的,是坚持学习、用心分享的自己
  6. vc 国际化的资源文件处理
  7. 计算机二级改错题在c里面改,全国计算机二级C改错题总结
  8. 云主机初体验(盛大云和阿里云)
  9. 【caffe-Windows】caffe+VS2013+Windows无GPU快速配置教程
  10. redis搭建集群(非主从)版本5.0
  11. 最新!2020世界一流大学学术排名出炉!
  12. mysql join 索引 无效_ORACLE MYSQL中join 字段类型不同索引失效的情况-阿里云开发者社区...
  13. 计算机教育部 学科分类,教育部学科分类及代码分类查询.pdf
  14. MCMC 改进粒子滤波算法及其在目标跟踪中的应用
  15. 贴上AI标签的综艺,未来的模样你敢想象吗?
  16. 树形结构 —— 树与二叉树 —— 无根树转有根树
  17. opencv 3 core组件进阶(2 ROI区域图像叠加图像混合;分离颜色通道、多通道图像混合;图像对比度,亮度值调整)...
  18. list_ndarray_csr_lil占用空间比较
  19. 什么是RMI,什么是RPC,两者之间的区别是什么?
  20. A律13折现编解码实现,SystemVerilog实现,实测可用带完整的testbench

热门文章

  1. ubuntu16.04没有声音解决方案( 通俗易懂)
  2. 在打字稿中,是什么! (惊叹号/ bang)运算符取消引用成员时?
  3. Win11管理员已阻止你运行此应用,有关详细信息怎么处理?
  4. win11玩游戏怎么样 windows11玩游戏的具体性能介绍
  5. ubuntu18.04系统ros melodic 安装orbslam2,Astra相机的ROS环境
  6. mybatis与Spring整合配置文件
  7. openopc.opcerror: dispatch: 无效的类字符串_实战PyQt5: 064-MV框架中的Model类
  8. 关于vuex中actions可以返回promise的用法
  9. 快速排序查询第k个数
  10. CSS3过渡练习-进度条(CSS3)