GCD dispatch_semaphore

当我们在处理一系列线程的时候,当数量达到一定量,在以前我们可能会选择使用NSOperationQueue来处理并发控制,但如何在GCD中快速的控制并发呢?答案就是dispatch_semaphore.

  信号量是一个整形值并且具有一个初始计数值,并且支持两个操作:信号通知和等待。当一个信号量被信号通知,其计数会被增加。当一个线程在一个信号量上等待时,线程会被阻塞(如果有必要的话),直至计数器大于零,然后线程会减少这个计数。

  在GCD中有三个函数是semaphore的操作,分别是:

  dispatch_semaphore_create   创建一个semaphore

  dispatch_semaphore_signal   发送一个信号

  dispatch_semaphore_wait    等待信号

  简单的介绍一下这三个函数,第一个函数有一个整形的参数,我们可以理解为信号的总量,dispatch_semaphore_signal是发送一个信号,自然会让信号总量加1,dispatch_semaphore_wait等待信号,当信号总量少于0的时候就会一直等待,否则就可以正常的执行,并让信号总量-1,根据这样的原理,我们便可以快速的创建一个并发控制来同步任务和有限资源访问控制

int data = 3;

__block int mainData = 0;

__block dispatch_semaphore_t sem = dispatch_semaphore_create(0);

dispatch_queue_t queue = dispatch_queue_create("StudyBlocks", NULL);

dispatch_async(queue, ^(void) {

int sum = 0;

for(int i = 0; i < 5; i++)

{

sum += data;

NSLog(@" >> Sum: %d", sum);

}

dispatch_semaphore_signal(sem);

});

dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);

for(int j=0;j<5;j++)

{

mainData++;

NSLog(@">> Main Data: %d",mainData);

}

dispatch_release(sem);

dispatch_release(queue);

输出:

2013-07-08 11:33:05.654 dispatch[1102:1e03]  >> Sum: 3

2013-07-08 11:33:05.656 dispatch[1102:1e03]  >> Sum: 6

2013-07-08 11:33:05.657 dispatch[1102:1e03]  >> Sum: 9

2013-07-08 11:33:05.658 dispatch[1102:1e03]  >> Sum: 12

2013-07-08 11:33:05.659 dispatch[1102:1e03]  >> Sum: 15

2013-07-08 11:33:05.660 dispatch[1102:c07] >> Main Data: 1

2013-07-08 11:33:05.660 dispatch[1102:c07] >> Main Data: 2

2013-07-08 11:33:05.660 dispatch[1102:c07] >> Main Data: 3

2013-07-08 11:33:05.661 dispatch[1102:c07] >> Main Data: 4

2013-07-08 11:33:05.661 dispatch[1102:c07] >> Main Data: 5

通过信号量就可以保证,Main Data 永远在Sum之后执行

GCD dispatch_semaphore

时间: 2024-11-05 15:48:49

GCD dispatch_semaphore的相关文章

完整详解GCD系列(四)dispatch_semaphore(信号量)

原创Blog,转载请注明出处 http://blog.csdn.net/hello_hwc?viewmode=contents 一 何为信号量? 简单来说就是控制访问资源的数量,比如系统有两个资源可以被利用,同时有三个线程要访问,只能允许两个线程访问,第三个应当等待资源被释放后再访问. 注意:再GCD中,只有调度的线程在信号量不足的时候才会进入内核态进行线程阻塞 二 如何使用信号量 三个主要函数 创建一个信号量 func dispatch_semaphore_create(_ value: In

GCD中的dispatch_semaphore的语法与作用

(一)引入问题 当并行执行的处理更新数据时,会产生数据不一致的情况,有时应用程序还会异常结束,虽然使用Serial Dipatch queue和dispatch_barrier_async函数可避免这类问题,但有必要进行更加细腻的排他控制 1 /*! 2 * @brief 不考虑顺序,将所有数据添加到数组中 3 */ 4 - (void)testError { 5 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_

OC多线程之GCD ----- 2

dispatch_create生成的Queue不管是并行队列还是串行队列,其优先级都是默认优先级 但是可以用dispatch_set_target_queue来改变队列的优先级 dispatch_set_target_queue(原来的队列, 目标优先级队列) 使用这个函数需要获取两个队列,一个是需要变更优先级的队列,一个是指定优先级的队列(指定优先级的队列可以通过get_global获得) 如果多个串行队列优先级相同,那么这些队列里的任务也会串行执行 dispatch_after函数并不能非常

对GCD的一些理解和实践

GCD GCD,全程Grand Central Dispatch,是苹果为了多核并行提出的解决方案.它是使用C语言实现,但是由于用了block来处理回调,所以使用起来十分方便.并且GCD会自动管理线程的生命周期,不需要我们去管理. 任务和队列 GCD中有两个重要的概念,任务和队列. 1.任务,就是我们想要处理的事情,任务可以分为同步执行和异步执行: 同步(sync):使用dispatch_sync(dispatch_queue_t queue, dispatch_block_t block) 创

深入了解GCD

首先提出一些问题: dispatch_async 函数如何实现,分发到主队列和全局队列有什么区别,一定会新建线程执行任务么? dispatch_sync 函数如何实现,为什么说 GCD 死锁是队列导致的而不是线程,死锁不是操作系统的概念么? 信号量是如何实现的,有哪些使用场景? dispatch_group 的等待与通知.dispatch_once 如何实现? dispatch_source 用来做定时器如何实现,有什么优点和用途? dispatch_suspend 和 dispatch_res

IOS开发之多线程 -- GCD的方方面面

前言:这篇GCD的博文是本人阅读了很多海内外大神的关于GCD的文章,以及结合之前自己对GCD的粗浅的认识,然后取其精华,去其槽粕,综合起来的笔记,而且是尽可能的以通熟易懂的并且是正确的理论论述方式呈现给读者,同时也是讲大神博客中有的深涩的理论理解的通熟易懂转述给读者,已经是尽可能的让读者深入理解和掌握多线程的知识以及GCD的使用技术.最后的附录中,我将会给出所有本人阅读的大神写的关于多线程或者是GCD的文章链接,大家感兴趣的,可以去参考和学习.也许,看我的这篇就够了,因为我就是参考他们的,嘻嘻.

GCD(续)

信号量 对于多个线程访问同个资源,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++) {     di

GCD(Grand Central Dispatch)的详解

GCD(Grand Central Dispatch) FIFO(先入先出) Dispatch(派遣,急件,分派) Serial (连续的,连载的,分期偿还的) Dispatch Queue(调度队列) Serial Dispatch Queue(串行调度队列) Concurrent Dispatch Queue(并发调度队列) Main Dispatch Queue(主要调度队列) Global Dispatch Queue(全局调度队列) dispatch_apply是(同步函数) GCD是

iOS开发-多线程之GCD(Grand Central Dispatch)

Grand Central Dispatch(GCD)是一个强有力的方式取执行多线程任务,不管你在回调的时候是异步或者同步的,可以优化应用程序支持多核心处理器和其他的对称多处理系统的系统.开发使用的过程中只需要将执行的任务并添加到到适当的Dispatch Queue中,GCD就能生成必要的线程并计划执行任务.Dispatch Queue更简单而且在实现符合需求的多线程任务时更有效率.Dispatch  Queue一般来说有三种方式,如下图: Serial执行的时候的先进先出,Concurrent