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的信号量



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,看下 面代码段:



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



相关文章
|
Java 开发者
多线程之GCD(一)
Grand Central Dispatch简称(GCD)是由苹果公司开发的技术,是一个非常好的用于多核设备的解决方案。GCD核心在于两个概念: 队列:队列负责管理开发者提交的任务,GCD队列始终以FIFO(先进先出)的方式来处理任务-----但由于处理执行的时间不同,所以先处理的任务并不一定先结束。
649 0
|
安全 调度 C语言
iOS多线程之GCD-同步、异步、并发、串行、线程组、栅栏函数、信号量等全网最全的总结
iOS多线程之GCD-同步、异步、并发、串行、线程组、栅栏函数、信号量等全网最全的总结
1166 1
|
调度 数据库
深入学习信号量
深入学习信号量 一.什么资源是临界资源? 临界资源是一次仅允许一个进程使用的共享资源 二.临界区域是什么意思?什么是临界代码? 每个进程中访问临界资源的那段程序称为临界区,或者叫临界代码。 三.临界区或者临界代码有什么特点: 每次只准许一个进程进入临界区,进入后不允许其他进程进入。
1096 0
|
API C# Windows
C#多线程(4):进程同步Mutex类
C#多线程(4):进程同步Mutex类
284 0

热门文章

最新文章