ParseSourceCodeStudy
ParseSourceCodeStudy copied to clipboard
下列代码运行没有效果
-
(void)viewDidLoad { [super viewDidLoad]; //因为用到了dispatch_barrier_async,该函数只能搭配自定义并行队列dispatch_queue_t使用。所以不能使用:dispatch_get_global_queue dispatch_queue_t queue = dispatch_queue_create("com.ioschengxuyuan.gcd.ForBarrier", DISPATCH_QUEUE_CONCURRENT); /* * *生成Dispatch Semaphore Dispatch Semaphore 的计数初始值设定为“1” (该初始值的1与下文中两个函数dispatch_semaphore_wait与dispatch_semaphore_signal进行的减1、加1里的1没有必然联系。
就算初始值是100,两个函数dispatch_semaphore_wait与dispatch_semaphore_signal还是会减“1”、加“1”)。 保证可访问 NSMutableArray 类对象的线程 同时只能有1个 * */ dispatch_semaphore_t semaphore = dispatch_semaphore_create(1) ; NSMutableArray array = [[NSMutableArray alloc] init]; for(int i = 0; i< 100000; ++i) { dispatch_async(queue, ^{ / * *等待Dispatch Semaphore *一直等待,直到Dispatch Semaphore的计数值达到大于等于1 / dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER) ; / *由于Dispatch Semaphore的计数值达到大于等于1 *所以将Dispatch Semaphore的计数值减去1 *dispatch_semaphore_wait 函数执行返回。 *即执行到此时的 *Dispatch Semaphore 的计数值恒为0 * *由于可访问NSMutaleArray类对象的线程 *只有一个 *因此可安全地进行更新 * / NSLog(@"🔴%@",[NSThread currentThread]); [array addObject:[NSNumber numberWithInt:i]]; / * *排他控制处理结束, *所以通过dispatch_semaphore_signal函数 *将Dispatch Semaphore的计数值加1 *如果有通过dispatch_semaphore_wait函数 *等待Dispatch Semaphore的计数值增加的线程, ★就由最先等待的线程执行。 / dispatch_semaphore_signal(semaphore); }); } / * 等为数组遍历添加元素后,检查下数组的成员个数是否正确 * */ dispatch_barrier_async(queue, ^{ NSLog(@"🔴类名与方法名:%s(在第%d行),描述:%@", PRETTY_FUNCTION, LINE, @([array count])); }); }
上面是文中的代码,实际运行后发现,不会运行dispatch_barrier_async方法里面的代码,做如下更改才可以:
把原文中的代码: for(int i = 0; i< 100000; ++i) { dispatch_async(queue, ^{ dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER) ;
改成: for(int i = 0; i< 100000; ++i) { dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER) ; dispatch_async(queue, ^{
才可以,楼主验证下看是不是这样