我当时正在读OReilly的“iOS6编程手册”(),对某些内容感到困惑。引用第378页第6章“并发性”:
对于不涉及UI的任何任务,可以在GCD中使用全局并发队列。它们允许同步或异步执行。,但同步执行并不意味着程序在继续之前等待代码完成。这意味着并发队列将等待任务完成,然后再继续到队列中的下一个代码块。当您将块对象放置到并发队列中时,您自己的程序总是立即继续,而不等待队列执行代码。这是因为并发队列(顾名思义)在主线程以外的线程上运行它们的代码。
我用粗体显示了引起我兴趣的文字。我认为这是错误的,因为正如我今天所了解到的,同步执行准确地意味着程序在继续之前等待代码完成。
这是正确的,还是它的实际工作方式?
发布于 2013-10-08 11:50:54
作者是Vandad Nahavandipoor,我不想影响这个人的销售收入,但他的所有书在并发章节中都有相同的错误:
rm?qid=1381231858&sr=8-2-ent
这很讽刺,因为他有一本关于这个主题的50页的书。
6?s=books&ie=UTF8&qid=1381232139&sr=1-6
人们应该停止读这家伙的书。
发布于 2013-10-04 16:09:15
这一段怎么错了?让我们数一数方式:
对于不涉及UI的任何任务,可以在GCD中使用全局并发队列。
这是过于具体和不准确的。某些以UI为中心的任务,例如加载映像,可以在主线程上完成。更好的说法是“在大多数情况下,除了主线程之外,不要与UIKit
类交互”,但也有一些异常(例如,从iOS 4、IIRC和绘图都是线程安全的,而绘图是一个可以卸载到后台线程的CPU密集型任务的一个很好的例子)。FWIW,任何可以提交到全局并发队列的工作单元,也可以提交到私有并发队列。
它们允许同步或异步执行。但是,同步执行并不意味着您的程序在继续之前等待代码完成。这仅仅意味着并发队列将等待任务完成,然后再继续到队列上的下一个代码块。
正如iWasRobbed推测的那样,它们似乎将同步/异步工作提交与串行/并发队列混为一谈。根据定义,同步执行执行,意味着程序在继续之前等待代码返回。根据定义,异步执行意味着程序不会等待。类似地,串行队列一次只执行一个提交的工作单元,并以FIFO顺序执行每个单元。在一般情况下,并行队列(私有队列或全局队列)(在第二种情况下更多)在一个或多个后台线程上按照它们排队的顺序提交块以供执行。使用的后台线程数是不透明的实现细节。
当您将块对象放置在并发队列中时,您自己的程序总是立即继续,而无需等待队列执行代码。
不是的。不是这样的。同样,他们把同步/异步和串行/并发混为一谈。我怀疑他们想说的是:当您异步地为一个块排队时,您自己的程序总是立即继续,而无需等待队列执行代码。
这是因为并发队列(顾名思义)在主线程以外的线程上运行它们的代码。
这也是不对的。例如,如果您有一个私有并发队列,用于充当保护某些可变状态的读取器/写入器锁,如果从主线程对该队列执行dispatch_sync
,则在许多情况下,您的代码将在主线程上执行。
整体而言,这整段是相当可怕和误导。
编辑:--我在对另一个答案的评论中提到了这一点,但是为了清楚起见,把它放在这里也许会有帮助。“同步与异步调度”的概念和“串行队列与并发队列”的概念在很大程度上是正交的。您可以以同步或异步的方式将工作分派到任何队列(串行或并发)。同步/异步二分法主要与“调度*er*”相关(因为它确定分配器是否被阻塞,直到块完成为止),而串行/并发二分法主要与调度*ee*块相关(因为它确定dispatchee是否与其他块并发执行)。
发布于 2013-10-04 15:24:54
我认为这一点文字写得不好,但它们基本上解释了在串行队列上执行与在并发队列上执行之间的区别。串行队列在一个线程上运行,因此没有选择,只能一次执行一个任务,而并发队列可以使用一个或多个线程。
串行队列按照放入队列的顺序执行一个又一个任务。每个任务都必须等待执行先前的任务,然后才能执行它(即同步执行)。
在并发队列中,任务可以在运行其他任务的同时运行,因为它们通常使用多个线程(即异步),但它们仍然按照排队的顺序执行,并且可以以任何顺序有效地完成它们。如果使用NSOperation
,还可以在并发队列上设置依赖项,以确保在执行其他任务之前执行某些任务。
https://stackoverflow.com/questions/19184301
复制相似问题