Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/109.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 我是否应该在@synchronized块中包装dispatch\u group\u leave?_Ios_Objective C_Macos_Grand Central Dispatch - Fatal编程技术网

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呢?应该是安全的。