dispatch_semaphore

dispatch_semaphore 信号量基于计数器的一种多线程同步机制。在多个线程访问共有资源时候,会因为多线程的特性而引发数据出错的问题。

dispatch_queue_t queue = dispatch_get_global_queue(0, 0);

dispatch_semaphore_t semaphore = dispatch_semaphore_create(1);

NSMutableArray *array = [NSMutableArrayarray];

for (int index = 0; index < 100000; index++) {

dispatch_async(queue, ^(){

dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);//

NSLog(@"addd :%d", index);

[array addObject:[NSNumber numberWithInt:index]];

dispatch_semaphore_signal(semaphore);

});

}

dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); 如果semaphore计数大于等于1.计数-1,返回,程序继续运行。如果计数为0,则等待。这里设置的等待时间是一直等待。dispatch_semaphore_signal(semaphore);计数+1.在这两句代码中间的执行代码,每次只会允许一个线程进入,这样就有效的保证了在多线程环境下,只能有一个线程进入。

dispatch_semaphore

时间: 2024-11-19 17:01:02

dispatch_semaphore的相关文章

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_

GCD dispatch_semaphore

当我们在处理一系列线程的时候,当数量达到一定量,在以前我们可能会选择使用NSOperationQueue来处理并发控制,但如何在GCD中快速的控制并发呢?答案就是dispatch_semaphore. 信号量是一个整形值并且具有一个初始计数值,并且支持两个操作:信号通知和等待.当一个信号量被信号通知,其计数会被增加.当一个线程在一个信号量上等待时,线程会被阻塞(如果有必要的话),直至计数器大于零,然后线程会减少这个计数. 在GCD中有三个函数是semaphore的操作,分别是: dispatch

dispatch_semaphore使用方法

第一.引入 dispatch_queue_t queue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); NSMutableArray *arr=[NSMutableArray new]; for (int i=0; i<100; i++) { dispatch_async(queue, ^{[arr addObject:[NSNumber numberWithInt:i]]; NSLog(@"the threa

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

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

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) 创

iOS 信号量

信号量就是一个资源计数器,对信号量有两个操作来达到互斥,分别是P和V操作. 一般情况是这样进行临界访问或互斥访问的: 设信号量值为1, 当一个进程1运行是,使用资源,进行P操作,即对信号量值减1,也就是资源数少了1个.这是信号量值为0.系统中规定当信号量值为0是,必须等待,知道信号量值不为零才能继续操作. 这时如果进程2想要运行,那么也必须进行P操作,但是此时信号量为0,所以无法减1,即不能P操作,也就阻塞.这样就到到了进程1排他访问. 当进程1运行结束后,释放资源,进行V操作.资源数重新加1,

深入了解GCD

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

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

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