gpt4 book ai didi

objective-c - dispatch_async vs dispatch_sync 执行顺序

转载 作者:太空狗 更新时间:2023-10-30 03:28:24 27 4
gpt4 key购买 nike

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

dispatch_queue_t serialQueue = dispatch_queue_create("com.unique.name.queue", DISPATCH_QUEUE_SERIAL);

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

- (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;
}

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

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

我见过类似的问题,答案是双向的,所以我正在寻找一个明确的答案,最好有 Apple 文档支持。

最佳答案

Are they guaranteed to be executed in the same order?

是的。

Will / could the isObjectInQueue execute first?

是的。

对两个答案都是肯定的原因是您应该考虑线程。这大概就是您首先使用串行队列的原因。您正在安全地访问该队列线程。

基本上, block 将按照它们放入串行队列的顺序执行。这是 100% 保证的。然而,如果多个线程都在努力解决这个问题,那么一个线程可能会在另一个线程有机会添加之前首先进入队列以读取某些内容。

In other words, does dispatch_async perform exactly the same as dispatch_sync (scheduling the block immediately) except that it doesn't block the calling thread?

没错。在这两种情况下, block 都被添加到队列中。它会立即添加。 dispatch_sync 在返回之前等待 block 完成,而 dispatch_async 立即返回。

关于objective-c - dispatch_async vs dispatch_sync 执行顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14293027/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com