1)ios中创建的串行队列
_queue =dispatch_queue_create("serial-queue-1", nil);
在主线程或其他线程上运行。
还有
2)如果它在主线程上运行,那么如果我们通过以下方式同步将代码块分派(dispatch)到上面的队列
dispatch_sync(_queue, ^{
方法1();
方法2();
});
当轮到这个队列时,它会执行完整的代码块吗?还是可以离开这个队列去执行其他队列?
最佳答案
通常,在队列上分派(dispatch)的 block 可以在任何可用线程上运行,包括主线程。异常(exception)是在主队列上分派(dispatch)的 block 将始终在主线程上运行。
当您在串行队列上使用dispatch_sync
时,它会阻塞当前队列,但不会阻塞当前线程。
Calling this function and targeting the current queue results in deadlock.
如果您使用dispatch_sync定位当前队列,您将遇到死锁,但如果您定位不同的队列,则不会出现死锁,即使分派(dispatch) block 最终位于同一线程上。
事实上:
As a performance optimization, this function executes blocks on the current thread whenever possible
因此,假设您问题中的dispatch_sync是从主队列调用的,则该 block 将在主线程上运行,因为您已经阻塞了主队列,因此主线程可用于执行工作。
iOS 多任务处理不是抢占式的,因此您的 block 不能“丢失”线程;该 block 将在放弃线程之前完整执行。这是假设 method1
和 method2
本身不会调度更多 block 。
关于ios - 串行队列(主线程除外)代码是否在主线程上执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56560364/