Ios 我是否应该在@synchronized块中包装dispatch\u group\u leave?
给定以下代码,Ios 我是否应该在@synchronized块中包装dispatch\u group\u leave?,ios,objective-c,macos,grand-central-dispatch,Ios,Objective C,Macos,Grand Central Dispatch,给定以下代码,@synchronized调用是否不需要 我假设dispatch\u group\u enter/leave是原子的,但这里没有将其列为线程安全,我突然担心我一直在搞砸 // Imagine this is on its own queue already (possibly main, possibly not) dispatch_group_t group = dispatch_group_create(); for(x in array){ dispatch_group_
@synchronized
调用是否不需要
我假设dispatch\u group\u enter/leave
是原子的,但这里没有将其列为线程安全,我突然担心我一直在搞砸
// Imagine this is on its own queue already (possibly main, possibly not)
dispatch_group_t group = dispatch_group_create();
for(x in array){
dispatch_group_enter(group);
[x doSomethingAsync:^{
// imagine x is part of a library which sometimes runs blocks on
// a different queue.
// surely dispatch_group_leave has its own internal synchronization?
@synchronized(group){
dispatch_group_leave(group);
}
}]
}
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
既然你没有产生线程,你就不必担心
在您的示例中,
dispatch\u group\u leave(group)
在同一线程上被调用。在调用dispatch\u group\u enter
和dispatch\u group\u leave
时,您不需要提供任何额外的同步。GCD本身提供并发和线程工具。如果需要额外的同步或障碍,我的期望是在文档中明确地调用它,就像调用了dispatch\u\t
s以拥有全局/静态存储的要求一样。换言之,GCD是一个线程库,因此,除非另有说明,否则它的调用应该提供彼此相关的线程安全性
这一期望是基于很多个人经验和Greg Parker不久前的经历。实际上,让我思考的是,我让另一个线程调用了块(默认情况下,AFNetworking completion处理程序在主队列上运行,而我的代码在它自己的队列中运行)。我已经更新了这个问题,使其更有趣一些?我认为,即使您
doSomethingAsync
在不同的线程中,回调块也会在主线程上调用。如果您愿意/需要,可以指定不同的线程,因此这并非不可能发生,这就是为什么我想知道那里是否需要@synchronized。是的,我想,就像你说的那样,必须保证线程库的线程安全是有点愚蠢的。那么dispatch\u group\u create呢?应该是安全的。