说说我对 GCD dispatch_semaphore_t
2015-10-31 21:16
399 查看
接触了好久的CGD只会简单的使用 异步线程和使用的时候确实挺方便的,但是一直没有时间深入的学习,这段时间偶然看到一个项目中有下面的那段代码
这些是什么意思呢?瞬间感觉高大上的代码有木有,怎么都感觉自己不会理解呢,
原来GCD用来处理并发线程的代码,也就是当线程量达到一个数量的的时候用来控制并发的数量
信号量是一个整形的并有一个初始值,支持信号通知和等待,当一个信号量被信号通知,他的计数就会加1,当一个线程在一个信号量上等待的时候
线程就有可能会被阻塞,直到计数器大于零,线程就会减少这个计数.
dispatch_semaphore_t sema =dispatch_semaphore_create(0);
dispatch_semaphore_signal(sema);
dispatch_semaphore_wait(sema,DISPATCH_TIME_FOREVER);
dispatch_release(sema)//在ARC模式下很少使用这个方法
运行结果如下
2015-10-31 20:12:11.549 Dispatch_semaphore_text[2770:82049] Maindata = 1
2015-10-31 20:12:11.549 Dispatch_semaphore_text[2770:82090] MyqueueBlock Sum = 3
2015-10-31 20:12:11.550 Dispatch_semaphore_text[2770:82090] MyqueueBlock Sum = 6
2015-10-31 20:12:11.550 Dispatch_semaphore_text[2770:82049] Maindata = 2
2015-10-31 20:12:11.550 Dispatch_semaphore_text[2770:82090] MyqueueBlock Sum = 9
2015-10-31 20:12:11.550 Dispatch_semaphore_text[2770:82049] Maindata = 3
2015-10-31 20:12:11.550 Dispatch_semaphore_text[2770:82090] MyqueueBlock Sum = 12
2015-10-31 20:12:11.550 Dispatch_semaphore_text[2770:82049] Maindata = 4
2015-10-31 20:12:11.550 Dispatch_semaphore_text[2770:82090] MyqueueBlock Sum = 15
2015-10-31 20:12:11.550 Dispatch_semaphore_text[2770:82049] Maindata = 5
运行结果如下:
2015-10-31 19:41:02.940 Dispatch_semaphore_text[2636:71628] MyqueueBlock Sum = 3
2015-10-31 19:41:02.940 Dispatch_semaphore_text[2636:71628] MyqueueBlock Sum = 6
2015-10-31 19:41:02.940 Dispatch_semaphore_text[2636:71628] MyqueueBlock Sum = 9
2015-10-31 19:41:02.941 Dispatch_semaphore_text[2636:71628] MyqueueBlock Sum = 12
2015-10-31 19:41:02.941 Dispatch_semaphore_text[2636:71628] MyqueueBlock Sum = 15
2015-10-31 19:41:02.941 Dispatch_semaphore_text[2636:71628] Maindata = 1
2015-10-31 19:41:02.941 Dispatch_semaphore_text[2636:71628] Maindata = 2
2015-10-31 19:41:02.942 Dispatch_semaphore_text[2636:71628] Maindata = 3
2015-10-31 19:41:02.942 Dispatch_semaphore_text[2636:71628] Maindata = 4
2015-10-31 19:41:02.942 Dispatch_semaphore_text[2636:71628] Maindata = 5
value ,当前并发执行的线程量
2.dispatch_semaphore_signal(dispatch_semaphore_t dsema);
发送一个信号出来,dsema的信号量加1
3.dispatch_semaphore_wait(dispatch_semaphore_t dsema, dispatch_time_t timeout);
dsema的信号量减1,dispatch_time_t的值有DISPATCH_TIME_NOW表示当前,DISPATCH_TIME_FOREVER表示遥远的未来
(a).dsema 的信号量大于0的时候就执行该函数下面的代码,并将信号量减1,
(b).dsema的信号量等于0 的时候函数就阻塞在当期的线程等待timeout时间再运行下面的代码,或等到接受到dispatch_semaphore_signal(dsema)发送的信号
(c).dispatch_time_t
的定义 t = dispatch_time(DISPATCH_TIME_NOW, 1*1000*1000*1000);
__block BOOL accessGranted = NO; __block dispatch_semaphore_t sema = dispatch_semaphore_create(0); [eventStore requestAccessToEntityType:EKEntityTypeEvent completion:^(BOOL granted, NSError *error) { accessGranted = granted; dispatch_semaphore_signal(sema); }]; dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER); dispatch_release(sema); static BOOL bFinish = YES; if (accessGranted) { bFinish = NO; //执行一些代码 bFinish = YES; }
这些是什么意思呢?瞬间感觉高大上的代码有木有,怎么都感觉自己不会理解呢,
原来GCD用来处理并发线程的代码,也就是当线程量达到一个数量的的时候用来控制并发的数量
信号量是一个整形的并有一个初始值,支持信号通知和等待,当一个信号量被信号通知,他的计数就会加1,当一个线程在一个信号量上等待的时候
线程就有可能会被阻塞,直到计数器大于零,线程就会减少这个计数.
dispatch_samaphore 提供的一下的四个函数进行操作
<pre name="code" class="objc"> dispatch_semaphore_create(long value); //创建信号 dispatch_semaphore_signal(dispatch_semaphore_t dsema); //发送信号 dispatch_semaphore_wait(dispatch_semaphore_t dsema, dispatch_time_t timeout); //等待信号 dispatch_release(dispatch_object_t object)//信号释放
dispatch_semaphore_t sema =dispatch_semaphore_create(0);
dispatch_semaphore_signal(sema);
dispatch_semaphore_wait(sema,DISPATCH_TIME_FOREVER);
dispatch_release(sema)//在ARC模式下很少使用这个方法
例子
dispatch_queue_t queue = dispatch_queue_create("MyqueueBlock", NULL);\ dispatch_async(queue, ^{ int sum = 0; for (int i = 0 ; i<5; i++) { sum += data; NSLog(@"Sum1 = %d",sum); } }); for (int i= 0 ; i < 5; i++) { maindata++; NSLog(@"Maindata = %d",maindata); }
运行结果如下
2015-10-31 20:12:11.549 Dispatch_semaphore_text[2770:82049] Maindata = 1
2015-10-31 20:12:11.549 Dispatch_semaphore_text[2770:82090] MyqueueBlock Sum = 3
2015-10-31 20:12:11.550 Dispatch_semaphore_text[2770:82090] MyqueueBlock Sum = 6
2015-10-31 20:12:11.550 Dispatch_semaphore_text[2770:82049] Maindata = 2
2015-10-31 20:12:11.550 Dispatch_semaphore_text[2770:82090] MyqueueBlock Sum = 9
2015-10-31 20:12:11.550 Dispatch_semaphore_text[2770:82049] Maindata = 3
2015-10-31 20:12:11.550 Dispatch_semaphore_text[2770:82090] MyqueueBlock Sum = 12
2015-10-31 20:12:11.550 Dispatch_semaphore_text[2770:82049] Maindata = 4
2015-10-31 20:12:11.550 Dispatch_semaphore_text[2770:82090] MyqueueBlock Sum = 15
2015-10-31 20:12:11.550 Dispatch_semaphore_text[2770:82049] Maindata = 5
把代码改成下面代码 把dispatch_semaphorer_t的代码给加上运行结果如下
</pre><pre name="code" class="objc"> dispatch_queue_t queue = dispatch_queue_create("MyqueueBlock", NULL);\ dispatch_async(queue, ^{ int sum = 0; for (int i = 0 ; i<5; i++) { sum += data; NSLog(@"Sum1 = %d",sum); } long semal = dispatch_semaphore_signal(sema);//发一信号出来 }); long semal2 = dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER); for (int i= 0 ; i < 5; i++) { maindata++; NSLog(@"Maindata = %d",maindata); }
运行结果如下:
2015-10-31 19:41:02.940 Dispatch_semaphore_text[2636:71628] MyqueueBlock Sum = 3
2015-10-31 19:41:02.940 Dispatch_semaphore_text[2636:71628] MyqueueBlock Sum = 6
2015-10-31 19:41:02.940 Dispatch_semaphore_text[2636:71628] MyqueueBlock Sum = 9
2015-10-31 19:41:02.941 Dispatch_semaphore_text[2636:71628] MyqueueBlock Sum = 12
2015-10-31 19:41:02.941 Dispatch_semaphore_text[2636:71628] MyqueueBlock Sum = 15
2015-10-31 19:41:02.941 Dispatch_semaphore_text[2636:71628] Maindata = 1
2015-10-31 19:41:02.941 Dispatch_semaphore_text[2636:71628] Maindata = 2
2015-10-31 19:41:02.942 Dispatch_semaphore_text[2636:71628] Maindata = 3
2015-10-31 19:41:02.942 Dispatch_semaphore_text[2636:71628] Maindata = 4
2015-10-31 19:41:02.942 Dispatch_semaphore_text[2636:71628] Maindata = 5
上面两个列子可以看出dispatch_async 虽然是异步操作,但是加上dispatch_semaphore_t之后就会等待dispatch_semaphore_t线程执行后再执行后面的代码
1.dispatch_semaphore_create(long value);创建信号value ,当前并发执行的线程量
2.dispatch_semaphore_signal(dispatch_semaphore_t dsema);
发送一个信号出来,dsema的信号量加1
3.dispatch_semaphore_wait(dispatch_semaphore_t dsema, dispatch_time_t timeout);
dsema的信号量减1,dispatch_time_t的值有DISPATCH_TIME_NOW表示当前,DISPATCH_TIME_FOREVER表示遥远的未来
(a).dsema 的信号量大于0的时候就执行该函数下面的代码,并将信号量减1,
(b).dsema的信号量等于0 的时候函数就阻塞在当期的线程等待timeout时间再运行下面的代码,或等到接受到dispatch_semaphore_signal(dsema)发送的信号
(c).dispatch_time_t
的定义 t = dispatch_time(DISPATCH_TIME_NOW, 1*1000*1000*1000);
相关文章推荐
- Java学习图形界面+网络编程案例---------网络简易通讯
- Divided Product
- java http 发请求,结果转jsonobject解析
- 去掉word中向下的箭头^l----->^p
- 宏
- OpenGL天空贴图以及反射纹理映射即镜面反射
- 《C++ primer》英文第五版阅读笔记(五)——const
- 字幕制作之压制视频
- 去掉word中向下的箭头^l----->^p
- Android学习之xUtils --- HttpUtils模块
- Jenkins搭建过程中遇到的问题整理记录
- hdoj--2069--Coin Change(动态规划)
- 杭电2802F(N)
- javascript 实现文本框明文转暗码
- hdoj--2069--Coin Change(动态规划)
- 【HDOJ】1508 Alphacode
- 【存档记录】给Spring Boot添加远程调试端口
- java编写螺旋矩阵
- 浅析Java中的final关键字
- 288家众筹平台正常运营 43家停运或倒闭