dispatch同步


[objc]
  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. 原文地址  http://www.cnblogs.com/sunfrog/p/3243230.html  
  2.   
  3. GCD提供两种方式支持dispatch队列同步,即dispatch组和信号量。  
  4. 一、dispatch组(dispatch group)  
  5.   
  6. 1. 创建dispatch组  
  7.   
  8. dispatch_group_t group = dispatch_group_create();   
  9.   
  10. 2. 启动dispatch队列中的block关联到group中  
  11.   
  12. dispatch_group_async(group, queue, ^{   
  13.   
  14.   // 。。。   
  15.   
  16. });   
  17.   
  18. 3. 等待group关联的block执行完毕,也可以设置超时参数  
  19.   
  20. dispatch_group_wait(group, DISPATCH_TIME_FOREVER);   
  21.   
  22. 4. 为group设置通知一个block,当group关联的block执行完毕后,就调用这个block。类似dispatch_barrier_async。  
  23.   
  24. dispatch_group_notify(group, queue, ^{  
  25.   
  26.   // 。。。   
  27.   
  28. });   
  29.   
  30. 5. 手动管理group关联的block的运行状态(或计数),进入和退出group次数必须匹配  
  31.   
  32. dispatch_group_enter(group);  
  33.   
  34. dispatch_group_leave(group);  
  35.   
  36. 所以下面的两种调用其实是等价的,   
  37.   
  38. A)  
  39.   
  40. dispatch_group_async(group, queue, ^{   
  41.   
  42.   // 。。。   
  43.   
  44. });   
  45.   
  46. B)   
  47.   
  48. dispatch_group_enter(group);  
  49.   
  50. dispatch_async(queue, ^{  
  51.   
  52.   //。。。  
  53.   
  54.   dispatch_group_leave(group);  
  55.   
  56. });  
  57.   
  58. 所以,可以利用dispatch_group_enter、 dispatch_group_leave和dispatch_group_wait来实现同步,具体例子:http://stackoverflow.com/questions/10643797/wait-until-multiple-operations-executed-including-completion-block-afnetworki/10644282#10644282。  
  59.   
  60.    
  61.   
  62. 二、dispatch信号量(dispatch semaphore)  
  63.   
  64. 1. 创建信号量,可以设置信号量的资源数。0表示没有资源,调用dispatch_semaphore_wait会立即等待。  
  65.   
  66. dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);  
  67.   
  68. 2. 等待信号,可以设置超时参数。该函数返回0表示得到通知,非0表示超时。  
  69.   
  70. dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);  
  71.   
  72. 3. 通知信号,如果等待线程被唤醒则返回非0,否则返回0。  
  73.   
  74. dispatch_semaphore_signal(semaphore);  
  75.   
  76. 最后,还是回到生成消费者的例子,使用dispatch信号量是如何实现同步:  
  77.   
  78.    
  79.   
  80. dispatch_semaphore_t sem = dispatch_semaphore_create(0);  
  81.   
  82. dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ //消费者队列  
  83.   
  84.       while (condition) {  
  85.   
  86.     if (dispatch_semaphore_wait(sem, dispatch_time(DISPATCH_TIME_NOW, 10*NSEC_PER_SEC))) //等待10秒  
  87.   
  88.       continue;  
  89.   
  90.     //得到数据  
  91.   
  92.   }  
  93.   
  94. });  
  95.   
  96. dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ //生产者队列  
  97.   
  98.       while (condition) {  
  99.   
  100.      if (!dispatch_semaphore_signal(sem))  
  101.   
  102.     {  
  103.   
  104.       sleep(1); //wait for a while  
  105.   
  106.       continue;  
  107.   
  108.     }  
  109.   
  110.     //通知成功  
  111.   
  112.   }  
  113.   
  114. });  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值