zoukankan      html  css  js  c++  java
  • GCD之信号量机制一

    在使用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时,相当于是串行队列,单线程执行。

  • 相关阅读:
    2018-2019-2 20165316 《网络对抗技术》 Exp6 信息搜集与漏洞扫描
    2018-2019-2 网络对抗技术 20165316 Exp5 MSF基础应用
    2018-2019-2 网络对抗技术 20165316 Exp4 恶意代码分析
    2018-2019-2 20165316 『网络对抗技术』Exp3:免杀原理与实践
    2018-2019-2 《网络对抗技术》Exp2 后门原理与实践
    2018-2019-2 20165316 《网络对抗技术》Exp1 PC平台逆向破解
    2018-2019-2 《网络对抗技术》Exp0 Kali安装 Week1 20165316
    最近决定要重新回到博客了
    清华大学OS操作系统实验lab1练习知识点汇总
    基本数据结构学习总结: 二叉树的遍历
  • 原文地址:https://www.cnblogs.com/yulei126/p/6783212.html
Copyright © 2011-2022 走看看