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立即返回.