dispatch_async vs dispatch_sync执行顺序

And*_*rew 9 concurrency sync objective-c grand-central-dispatch dispatch-async

我有一个创建的串行调度队列:

dispatch_queue_t serialQueue = dispatch_queue_create("com.unique.name.queue", DISPATCH_QUEUE_SERIAL);
Run Code Online (Sandbox Code Playgroud)

我想使用这个串行队列来确保类访问的线程安全性,同时自动异步工作,不需要返回调用线程.

- (void)addObjectToQueue:(id)object
{
    dispatch_async(serialQueue, ^{
        // process object and add to queue
    }); 
}

- (BOOL)isObjectInQueue:(id)object
{
    __block BOOL returnValue = NO;
    dispatch_sync(serialQueue, ^{
        // work out return value
    });
    return returnValue;
} 
Run Code Online (Sandbox Code Playgroud)

如果我调用addObjectToQueue:方法,然后立即调用isObjectInQueue:方法,它们是否保证以相同的顺序执行,或者is/In将首先执行isObjectInQueue?

换句话说,dispatch_async执行与dispatch_sync完全相同(立即调度块),除了它不阻塞调用线程?

我已经看到类似的问题,答案是双向的,所以我正在寻找一个明确的答案,最好用Apple文档支持.

mat*_*way 13

它们是否保证以相同的顺序执行?

是.

会先/ isObjectInQueue先执行吗?

是.

两个答案都是肯定的原因是你应该考虑线程化.这可能是您首先使用串行队列的原因.您正在访问该队列线程安全.

基本上,块将按照它们放在串行队列上的顺序执行.这是100%保证.但是,如果多个线程正在锤击,那么在另一个线程有机会添加它之前,一个线程可能首先进入队列中读取某些内容.

换句话说,dispatch_async执行与dispatch_sync(立即调度块)完全相同,只是它不会阻塞调用线程?

那就对了.在这两种情况下,块都会添加到队列中.它会立即添加.dispatch_sync只是在返回之前等待块完成,而dispatch_async立即返回.

  • 对; 或者,总结一下,串行队列中的块将按添加的顺序执行,并且当您从单个线程中调用dispatch_async()/ dispatch_sync()时,该顺序将只是确定性的.如果需要多线程且您需要订购,则必须提供同步机制.您可能需要"isObjectInQueue:"的返回值的"新鲜度"指示符,因为它可能在并发环境中快速失去有效性.即并发很难. (2认同)