例子:
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
});
}
});
这些操作将排队在同一队列中,代码将在哪个线程上运行是更多实现细节。这样,如果您在无限循环中执行此操作,则将类似于以下内容:
一旦安排了
dispatch_sync
(未执行),您的下一个dispatch_apply
将被执行,因此队列的大小将非常快地增加。