ios - GCD为什么在我读取共享资源时使用dispatch_sync
<p><p>当我阅读共享资源时,我对使用 <code>dispatch_sync</code> 有一些疑问。
我在 Stack Overflow 上搜索了几个问题(如:<a href="https://stackoverflow.com/questions/32647214/gcd-dispatch-barrier-or-dispatch-sync" rel="noreferrer noopener nofollow">GCD dispatch_barrier or dispatch_sync?</a>),但没有找到确切的答案。</p>
<p>我不明白为什么要使用</p>
<pre><code>- (void)addPhoto:(Photo *)photo
{
if (photo) { // 1
dispatch_barrier_async(self.concurrentPhotoQueue, ^{ // 2
; // 3
dispatch_async(dispatch_get_main_queue(), ^{ // 4
;
});
});
}
}
- (NSArray *)photos
{
__block NSArray *array; // 1
dispatch_sync(self.concurrentPhotoQueue, ^{ // 2
array = ;
});
return array;
}
</code></pre>
<p>我知道为什么要使用<code>dispatch_barrier_async</code>,但是我不知道为什么在阅读<code>_photosArray</code>的时候使用dispatch_sync,我猜<code>_photosArray<的写操作</code>在<code>self.concurrentPhotoQueue</code>中,所以<code>_photosArray</code>的读取操作也需要在<code>self.concurrentPhotoQueue</code>中,否则使用<code> dispatch_sync</code> 为了实现多读?</p>
<p>如果我在读操作时不使用<code>dispatch_sync</code>会怎样?如:</p>
<pre><code>- (NSArray *)photos
{
__block NSArray *array;
array = ;
return array;
}
</code></pre>
<p>非常感谢!</p></p>
<br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
<p><p>可能 <code>concurrentPhotoQueue</code> 是一个串行队列。 <code>concurrentPhotoQueue</code>主要是为了同步访问<code>photos</code>数组。</p>
<p>由于它是串行的,因此来自该队列的所有访问都被序列化,如果您的应用中没有来自其他队列/线程的访问,则不会发生竞争条件。</p>
<p>写入访问可能是异步的,因为写入者通常不需要写入操作的结果。但是读取必须同步完成,因为调用者必须等待结果。如果您的 <code>photos</code> 方法将使用 <code>dispatch_async</code> 它会将结果写入 <code>array</code> <em>after</em> <code>photos</code> 方法已返回。因此,<code>photos</code> 总是会返回 <code>nil</code>。</p>
<p>您的 <code>photos</code> 的非同步版本可能会产生竞争条件:<code>_photosArray</code> 可以在复制其内容时被修改,例如复制项目的数量和长度数组不同。这可能会导致 <code>arrayWithArray:</code> 内部崩溃。</p></p>
<p style="font-size: 20px;">关于ios - GCD为什么在我读取共享资源时使用dispatch_sync,我们在Stack Overflow上找到一个类似的问题:
<a href="https://stackoverflow.com/questions/48727343/" rel="noreferrer noopener nofollow" style="color: red;">
https://stackoverflow.com/questions/48727343/
</a>
</p>
页:
[1]