鉴于以下代码,@synchronized
是否需要调用?
我认为dispatch_group_enter/leave
是原子的,但它在这里没有被列为线程安全https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man3/dispatch_group_leave.3.html而且我突然担心我一直在搞乱。
// 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);
答案 0 :(得分:1)
调用dispatch_group_enter
和dispatch_group_leave
时,您无需提供任何其他同步。 GCD本身就是提供并发和线程工具。如果需要额外的同步或障碍,我的期望是它将在文档中明确调出,就像dispatch_once_t
要求调用全局/静态存储一样。换句话说,GCD 是一个线程库,所以期望的是,除非另有说明,否则它的调用应该提供相对于彼此的线程安全性。
这种期望是基于很多个人经验和Greg Parker一段时间后a similar statement on a mailing list做出的。
答案 1 :(得分:0)
由于你没有产生线程,所以你不必担心。
在您的示例中,dispatch_group_leave(group)
在同一个线程上调用。