例子:

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

我决定进行测试,并注意到非线程安全操作按预期执行。但是,当我使用全局队列调用dispatch_sync时,情况迅速恶化。

所以我的问题是:
1.像这样的电话在幕后发生了什么?
2.是否在自己的线程上抢先调度了dispatch_apply的每个迭代,然后依次执行?
3.如果对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_sync(未执行),您的下一个dispatch_apply将被执行,因此队列的大小将非常快地增加。

    10-08 20:01