串行询问和同步操作

时间:2015-07-15 15:42:49

标签: objective-c multithreading

我正在研究多线程,我想要的是对主题的一些澄清。

据我所知, SERIAL 队列按顺序执行任务,一次只执行一项任务。

现在, SYNCHRONOUS 函数是一个函数,只有在所有任务完成后才会返回。

现在,我有点困惑。这两者有什么区别?

如果我理解正确的话,它们都会阻止当前线程(如果它们不是"覆盖"在全局并发队列中),并且它们都完全在FIFO中执行任务顺序。

那么,它们究竟有什么区别呢?是的,我知道serial是队列的属性,而sync是一个函数(或操作)。但他们的功能就像是相似的。

1 个答案:

答案 0 :(得分:1)

您正在将队列与功能进行比较,因此很难定义"差异"。使用串行队列可确保其操作的顺序行为。通常,如果程序必须等待所有排队操作在程序完成之前完成,则使用同步分派。如果给定队列上的每个调度都是同步的,那么使用队列或调用操作之间确实没有区别。

然而,这是一个非常有用的案例,显示了差异。假设操作A很长并且您不想阻止。假设操作B返回由操作A计算的内容,但稍后会在某个任意时间调用它(就像响应用户操作一样)。您将dispatch_async A发送到队列中。您的程序未被阻止。过了一段时间,你需要结果。您在同一串行队列上 dispatch_sync 操作B.

现在,如果A已经完成,则在添加B时队列为空,B立即执行。但是(这里是好的部分)如果A仍在执行(异步),则在A完成之前不会调度B,因此您的程序将被阻止,直到它所需的结果准备就绪。

有关详细说明,请参阅here

gcd很好地处理了死锁的危险。