菜鸟教程小白 发表于 2022-12-12 14:32:13

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]
查看完整版本: ios - GCD为什么在我读取共享资源时使用dispatch_sync