在使用NSOperationQueue进行多线程编程时,可通过[queue setMaxConcurrentOperationCount:5]来设置线程池中最多并行的线程数,在GCD中信号量机制也和它相似,可以控制并发的线程数量。

1.首先熟悉下几个函数

dispatch_semaphore_create 创建一个信号量,设置一个初始值
dispatch_semaphore_signal 发送一个信号,信号通知,信号量+1
dispatch_semaphore_wait 等待信号,信号量-1

当一个信号量被通知 ,信号量就会加1,当一个信号等待,信号总量就减1,当减到信号量小于0时,线程会被阻塞,信号量不会在减了。直到信号量大于0时,线程会再次启动执行

下面参考http://blog.sina.cn/dpool/blog/s/blog_ac94a55f0101pa4l.html建了一个初始值为10的信号量

1
2
3
4
5
6
7
8
9
10
11
12
13
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++) {
       //信号量减1,如果同时开启10个以上的线程,则信号量小于等于0,此时就会阻塞该线程。
       dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
       dispatch_group_async(group, queue, ^{
           NSLog(@"test %d",i);
       //每个线程执行减1后通过信号量通知加1,这样始终保持线程在10个之内
       dispatch_semaphore_signal(semaphore);
       });
   }
   dispatch_group_wait(group, DISPATCH_TIME_FOREVER);

运行结果:

上面的例子可能效果不太明显,现在设置信号量初始值为1,看下 面代码段:

1
2
3
4
5
6
7
8
9
10
11
12
13
dispatch_group_t group=dispatch_group_create();
    dispatch_semaphore_t semaphore=dispatch_semaphore_create(1);
    dispatch_queue_t queue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    for (int i=0; i<100; i++) {
        //信号量减1,如果同时开启10个以上的线程,则信号量小于等于0,此时就会阻塞该线程。
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
        dispatch_group_async(group, queue, ^{
            NSLog(@"test %d",i);
        //每个线程执行减1后通过信号量通知加1,这样始终保持线程在10个之内
        dispatch_semaphore_signal(semaphore);
        });
    }
    dispatch_group_wait(group, DISPATCH_TIME_FOREVER);

运行结果:

初始值设为1时,相当于是串行队列,单线程执行。

GCD之信号量机制一的更多相关文章

  1. GCD之信号量机制二

    在前面GCD之信号量机制一中介绍了通过信号量设置并行最大线程数,依此信号量还可以防止多线程访问公有变量时数据有误,下面的代码能说明. 1.下面是不采用信号量修改公有变量的值 1 2 3 4 5 6 7 ...

  2. 【转】进程同步之信号量机制(pv操作)及三个经典同步问题

    原文地址:http://blog.csdn.net/speedme/article/details/17597373 上篇博客中(进程同步之临界区域问题及Peterson算法),我们对临界区,临界资源 ...

  3. 锁机制(Lock) 信号量机制(Semaphore) 事件机制(Event)

    IPC  进程间通信(inter-Process Communicate) 锁机制(Lock) l = Lock() 开启一个锁机制(实例化)   一把锁配一个钥匙 l.acquire()  获得钥匙 ...

  4. Linux高级调试与优化——信号量机制与应用程序崩溃

    背景介绍 Linux分为内核态和用户态,用户态通过系统调用(syscall)进入内核态执行. 用户空间的glibc库将Linux内核系统调用封装成GNU C Library库文件(兼容ANSI &am ...

  5. C语言使用信号量机制实例:

    C语言使用信号量机制实例: #include <signal.h> #include <unistd.h> #include <stdio.h> #include ...

  6. GCD和信号量

    GCD 概念不多说,直接上代码.话说也不是什么高深的东东,不过极大简化了代码,一目了然.后面对信号量的记录也采用了相同的原理. //抛出线程 dispatch_async(dispatch_get_g ...

  7. 【原创】Linux信号量机制分析

    背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本: ...

  8. 信号量机制DOWN操作和UP操作的详细说明

    DOWN操作:linux内核.信号DOWN例如,下面的操作: void down(struct semaphore *sem); //不间断 int down_interruptible(struct ...

  9. 基类子类在Qt信号量机制下的思考

    背景知识: 基类 superClass class superClass { public: superClass() { std::string m = "superClass() &qu ...

随机推荐

  1. face ++ 人脸识别技术初步

    网站地址: https://console.faceplusplus.com.cn/documents/5671791主要有        1  人脸识别技术         2    人体识别技术  ...

  2. Centos 6.5 安装 python3.6.2、pip9.0.1、ipython6.1

    说明:由于Cenots 6.5 默认是安装的 python 2.6.6  要想同一台主机使用多个python版本,不能影响原来的版本,因为系统很多还依赖于python,比如 yum    python ...

  3. [小北De编程手记] [Lesson 02] AutoFramework构建 之 Page Objects - 设计模式

    写在最前面 这个系列的主旨是要跟大家分享一下关于自动化测试框架的构建的一些心得.这几年,做了一些自动化测试框架以及团队的构建的工作.过程中遇到了很多这样的同学,他们在学习了某一门语言和一些自动化测试的 ...

  4. POI操作Excel的API注意点总结

    本篇是关于POI.jar操作Excel的API注意事项 基数问题 说明:我使用的是POI 3.15版本的,在版本问题上建议大家,在版本稳定的基础上尽量使用高版本的 看过很多帖子在问一个问题:假设原来有 ...

  5. windows.onload和 document.ready区别

    在Jquery里面,我们可以看到两种写法:$(function(){}) 和$(document).ready(function(){}) 这两个方法的效果都是一样的,都是在dom文档树加载完之后执行 ...

  6. [转]Java7中的ForkJoin并发框架初探(上)——需求背景和设计原理

    详见: http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp83 这篇我们来简要了解一下JavaSE7中提供的一个新特性 -- For ...

  7. Mac系统的终端显示git当前分支

    当我第一次在mac系统下使用git的时候,发现一个问题,git默认是不显示当前所在的分支名称,然后网上查找资料,找到了解决办法,终于可以显示本地当前分支,现在分享如下. 1 进入你的home目录 cd ...

  8. 深度剖析Java变量栈&对象堆

    Java把内存分成两种,一种叫做栈内存,一种叫做堆内存 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配.当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间 ...

  9. 如何在C++中产生随机数

    C++中没有自带的random函数,要实现随机数的生成就需要使用rand()和srand().不过,由于rand()的内部实现是用线性同余法做的,所以生成的并不是真正的随机数,而是在一定范围内可看为随 ...

  10. 团队作业4——第一次项目冲刺(Alpha版本)7th day

    一.Daily Scrum Meeting照片 二.燃尽图 三.项目进展 在计时模式下能够记录用户的用户名和成绩,没有弄登录功能, 将程序定义为单机的 未完成的卡片为登录功能和使用QQ登录. 四.困难 ...