我应该在@synchronized块中包装dispatch_group_leave吗?

时间:2015-05-27 08:24:17

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

鉴于以下代码,@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);

2 个答案:

答案 0 :(得分:1)

调用dispatch_group_enterdispatch_group_leave时,您无需提供任何其他同步。 GCD本身就是提供并发和线程工具。如果需要额外的同步或障碍,我的期望是它将在文档中明确调出,就像dispatch_once_t要求调用全局/静态存储一样。换句话说,GCD 一个线程库,所以期望的是,除非另有说明,否则它的调用应该提供相对于彼此的线程安全性。

这种期望是基于很多个人经验和Greg Parker一段时间后a similar statement on a mailing list做出的。

答案 1 :(得分:0)

由于你没有产生线程,所以你不必担心。

在您的示例中,dispatch_group_leave(group)在同一个线程上调用。