在dispatch_sync中从同一并发队列调用dispatch_apply时内部会发生什么

时间:2011-10-19 19:23:12

标签: objective-c c multithreading macos grand-central-dispatch

示例:

dispatch_sync(someConcurrentQueue, ^(){
    dispatch_apply(5,someConcurrentQueue, ^(size_t i){
        // do some non-thread safe operation
     });
});

我决定对此进行测试,并注意到非线程安全操作按预期执行。但是,当我使用全局队列调用dispatch_sync时,事情很快就会恶化。

所以我的问题是: 1.通过这样的电话在幕后发生了什么? 2. dispatch_apply的每次迭代都是在其自己的线程上抢先调度然后串行执行的吗? 3.如果2的答案是肯定的,那么在无限循环中这样做是否会提高性能?原因是操作可以在最后一次完成后立即开始执行,而不是再次循环。

1 个答案:

答案 0 :(得分:2)

这大致与:

相同
dispatch_sync(someConcurrentQueue, ^(){
    for (size_t i = 0; i < 5; ++i){
        dispatch_async(someConcurrentQueue, ^(){
            // do some non-thread safe operation
        });
    }
});

操作将在同一队列中排队,代码将运行的线程更多是实现细节。因此,如果您在无限循环中执行此操作,它将看起来像这样:

  • 同步
  • 异步(0)
  • 异步(1)
  • 异步(2)
  • 异步(3)
  • 异步(4)
  • 同步
  • ...

当您的下一个dispatch_syncdispatch_apply被安排(未执行)后执行时,您的队列将会非常快速地增加。