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

  • 相关阅读:
    could not detect mdm peripheral on hardware
    学习zynq的一些感受
    sdk添加新的C文件编译出错
    linux下驱动webcam
    转:fatal error: SDL/SDL.h: No such file or directory
    转:Unknown module(s) in QT: multimedia
    HFSS设计导入AD中
    REST(Representational state transfer)的四个级别以及HATEOAS介绍
    Servlet CDI Example Analysis
    Introduction and use of Cookie and Session(Cookie&Session的介绍和使用)
  • 原文地址:https://www.cnblogs.com/yulei126/p/6783212.html
Copyright © 2011-2022 走看看