是否在主线程上执行串行队列(非Main)代码?

时间:2019-06-12 10:48:50

标签: ios objective-c multithreading

1)在ios中创建的串行队列

_queue = dispatch_queue_create("serial-queue-1", nil);

在主线程或某些其他线程上运行。

2)如果它在主线程上运行,那么我们是否通过以下方式将代码块同步分派到上述队列中

dispatch_sync(_queue, ^{ method1(); method2(); });

轮到该队列时,它是否应该执行完整的代码块,或者还可以让该队列在两者之间执行其他一些代码?

1 个答案:

答案 0 :(得分:0)

通常,在队列上分派的块可以在任何可用线程(包括主线程)上运行。唯一的例外是,在主队列上调度的块将始终在主线程上运行。

在串行队列上使用dispatch_sync时,它将阻塞当前的队列,但不会阻塞当前的 thread

dispatch_sync documentation

  

调用此函数并定位当前队列会导致死锁。

如果使用dispatch_sync定位当前队列,则将出现死锁,但是如果定位不同的队列,则即使已分派的块最终在同一线程中,也不会出现死锁。

事实上:

  

作为性能优化,此函数在可能的情况下在当前线程上执行块

因此,假设您问题中的dispatch_sync是从主队列中调用的,则该块将在主线程上运行,因为您已经阻塞了主队列,因此可以使用主线程来执行工作了。

iOS多任务处理不是抢占式的,因此您的块无法“丢失”线程;该块将在放弃线程之前完整执行。假设method1method2本身不会再分发其他块。