【发布时间】:2017-06-08 07:24:32
【问题描述】:
好的,所以我已经经历了很多问题和答案,并且我知道对它的理解,但是当我尝试一些代码时,我得到了一些不支持这些理论的结果。
到目前为止我所理解的:
- 同步:一旦块内的所有任务都执行完毕,控制权就会返回。
- 异步:在块被击中后控制将立即返回。
这是看起来不错的部分。 现在是棘手的部分
- 串行:任务将在块内以串行方式执行。 Q1:这适用于块内的任务吗?因为它已经在所有情况下发生。同样对于同步串行队列,在不同的块中添加任务并不重要,因为一旦第一个任务完成,控制权就会返回。
例如-
let syncQ = DispatchQueue(label:"xyz") // by default it is serial
syncQ.sync{
for _ in 0...10{
print("ABC")
}
}
syncQ.sync{
for _ in 0...10{
print("XYZ")
}
}
预期输出:ABC * 10 , XYZ * 10 这很好。
现在当我引入并发串行 Q 时,输出是相同的。所以我的问题是并发队列说任务将在同一时间或同时完成,它没有发生。
例如 -
let syncConc = DispatchQueue(label:"con",attributes:.concurrent)
syncConc.sync{
for _ in 0...10{
print("XYZ")
}
for _ in 0...10{
print("ABC")
}
}
syncConc.sync{
for _ in 0...10{
print("HHH")
}
for _ in 0...10{
print("XXX")
}
}
输出:XYZ *10 ,ABC*10, HHH*10, XXX*10
所以看起来同步并发队列,就像串行队列一样,并且进行并发操作的唯一方法是,如果我们在操作之间抛出一个异步队列。 所以从这里我无法理解,并发类型的串行队列的目的是什么。
如果有人可以提供编码示例,将不胜感激,因为我已经知道它的理论和工作原理。 非常感谢。
【问题讨论】:
-
并发类型的串行队列的目的是什么???你是如何推断串行队列可能是并发的?队列是串行或并发的。这很容易
-
不需要弄清楚吗?因为我们可以选择使串行队列并发。我的问题是,在一个串行队列中添加多个任务应该是并发的。在文档中它说这应该发生,在所有解释性教程中它也再次这样说,但是当我尝试做同样的事情时它不会发生。也许这是我想念的东西
-
信息从哪里来?如果分派给它的所有任务都是串行执行的,则队列是串行的。如果分派给它的所有任务都同时执行,则队列是并发的。请再次检查文档或查看iosbrain.com/blog/2017/02/06/…
-
对不起,我的意思是:同步 - 并发队列,这就是我的问题所在。我确实得到队列的类型:串行和并发。但是当我创建一个并发和同步的队列时,它的行为不像它所说的那样。希望我能消除混乱
-
确实如此。同步意味着,您将任务分派到队列的线程被阻塞,直到任务完成执行(在某个线程上)。您可以同时从不同的线程分派更多同步任务。所有任务将同时执行。在您的示例中,您从 main 分派,main 在任务执行时被阻塞,然后您分派其他任务 ...
标签: ios swift grand-central-dispatch