码迷,mamicode.com
首页 > 其他好文 > 详细

GCD(续)

时间:2015-11-02 00:24:09      阅读:158      评论:0      收藏:0      [点我收藏+]

标签:

信号量

对于多个线程访问同个资源,GCD还提供是一种解决方法,就是信号量dispatch_semaphore

dispatch_queue_t asynQueue = dispatch_queue_create("asyn", DISPATCH_QUEUE_CONCURRENT);

dispatch_semaphore_t semaphore = dispatch_semaphore_create(2);
for (int i = 0; i < 20; i++)
{
    dispatch_async(asynQueue, ^{
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
        NSLog(@"semaphore %@------ %i", semaphore, i);
        sleep(2);
        dispatch_semaphore_signal(semaphore);
    });
}

dispatch_semaphore_create(2)创建了一个总量为2的信号量;

dispatch_semaphore_wait是等待信号,并让信号量-1,如果获取到的信号量是0,那么根据设置的超时时间进行等待,例子里设置的超时时间是一直;

dispatch_semaphore_signal是发送信号,并让信号量+1;

这套信号机制是不是很类似引用计数。所以,上面的这段代码并发了20个任务,每个任务都会有sleep,但每执行2个任务,经由dispatch_semaphore_wait减了两次,就为0,其他的任务只能等sleep后dispatch_semaphore_signal加回信号量才能执行,如此反复。

GCD(续)

标签:

原文地址:http://my.oschina.net/u/574245/blog/524692

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!