经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 移动开发 » iOS » 查看文章
ios开发GCD(2)-dispatch_semaphore_t信号量计数器
来源:cnblogs  作者:昔年随心  时间:2018/10/17 8:58:57  对本文有异议

思考:现在有多个线程异步执行,我们想要同时最多只能执行2个或n个,该怎么办?

dispatch_semaphore_t

看代码解析:

  1. NSLog(@"开始");
  2. dispatch_semaphore_t t = dispatch_semaphore_create(2);//设置信号量初始值
  3. dispatch_async(dispatch_queue_create("one", DISPATCH_QUEUE_CONCURRENT), ^{
  4. dispatch_semaphore_wait(t, DISPATCH_TIME_FOREVER);//只有信号量>0时,才执行后面的代码,信号量-1;否则,处于等待状态。
  5. //要执行的操作
  6. NSLog(@"任务1=%@",[NSThread currentThread]);
  7. sleep(5);
  8. dispatch_semaphore_signal(t);//任务完成,信号量+1
  9. });
  10. dispatch_async(dispatch_queue_create("two", DISPATCH_QUEUE_CONCURRENT), ^{
  11. dispatch_semaphore_wait(t, DISPATCH_TIME_FOREVER);//只有信号量>0时,才执行后面的代码,信号量-1;否则,处于等待状态。
  12. //要执行的操作
  13. NSLog(@"任务2=%@",[NSThread currentThread]);
  14. sleep(5);
  15. dispatch_semaphore_signal(t);//任务完成,信号量+1
  16. });
  17. dispatch_async(dispatch_queue_create("three", DISPATCH_QUEUE_CONCURRENT), ^{
  18. dispatch_semaphore_wait(t, DISPATCH_TIME_FOREVER);//只有信号量>0时,才执行后面的代码,信号量-1;否则,处于等待状态。
  19. //要执行的操作
  20. NSLog(@"任务3=%@",[NSThread currentThread]);
  21. dispatch_semaphore_signal(t);//任务完成,信号量+1
  22. });
  23. dispatch_async(dispatch_queue_create("four", DISPATCH_QUEUE_CONCURRENT), ^{
  24. dispatch_semaphore_wait(t, DISPATCH_TIME_FOREVER);//只有信号量>0时,才执行后面的代码,信号量-1;否则,处于等待状态。
  25. //要执行的操作
  26. NSLog(@"任务4=%@",[NSThread currentThread]);
  27. dispatch_semaphore_signal(t);//任务完成,信号量+1
  28. });

看打印结果:

  1. 2018-10-16 14:05:48.148321+0800 NSThread-GCD-NSOperation[5280:2575154] 开始
  2. 2018-10-16 14:05:48.150346+0800 NSThread-GCD-NSOperation[5280:2575369] 任务1=<NSThread: 0x1c0279a40>{number = 3, name = (null)}
  3. 2018-10-16 14:05:48.150867+0800 NSThread-GCD-NSOperation[5280:2575278] 任务2=<NSThread: 0x1c447ee00>{number = 4, name = (null)}
  4. 2018-10-16 14:05:53.152640+0800 NSThread-GCD-NSOperation[5280:2575371] 任务3=<NSThread: 0x1c046bd00>{number = 5, name = (null)}
  5. 2018-10-16 14:05:53.152729+0800 NSThread-GCD-NSOperation[5280:2575372] 任务4=<NSThread: 0x1c4476440>{number = 6, name = (null)}

解析:

这里有4个线程异步执行,正常情况下,是同时执行的,不分先后;

这里将信号量设为2,说明同时只能执行2个任务。

代码执行到任务1,信号量-1,这时信号量=1;因为我们设置的同时可以执行2个任务,所以任务2此时也可以执行,代码执行到任务2时,信号量继续-1,此时信号量=0;因为前两个任务都是耗时操作,任务不完成,导致信号量不释放出来(+1),所以后面的异步线程不会执行;只有当前面的有任务完成,信号量+1,这时监测到信号量>0,才会执行后面的任务。

由打印结果可以看到,任务3和4打印时间比任务1和2迟了5秒。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号