swift - 如果在串行 DispatchQueue 中触发上下文切换会发生什么情况?

标签 swift multithreading grand-central-dispatch swift-playground

原则上,一个串行的DispatchQueue会依次执行提交的任务。但是,如果在一个任务中触发了上下文切换(例如,调用 sleep)怎么办?队列是立即执行下一个任务,还是等待当前任务完成?

对于这段代码:

q.async {
    print("IN 1")
    var i = 1
    while i < 10 {
     Thread.sleep(forTimeInterval: 0.1)
     i += 1
    }
    print("OUT of 1")
}

q.async {
    print("IN 2")
}

结果是:

// IN 1 -> OUT of 1 -> IN 2 ?
// or IN 1 -> IN 2 -> OUT of 1 ?

我尝试在 playground 中运行代码,但似乎 sleep(和 Thread.sleep)在 Playground 中不起作用。

最佳答案

串行队列在前一个 block 完成之前不会开始执行下一个 block 。上下文切换不会影响这一点。如果您在提交给串行队列的 block 中调用 sleep,这将阻塞队列,直到 sleep 结束并且您的 block 可以恢复执行。所以你的结果将是 IN 1 -> OUT of 1 -> IN 2

请注意,通常您不想在提交到队列的 block 中执行阻塞操作(如 sleep),因为这会阻塞整个线程,使 libdispatch 无法使用用于其他工作。 libdispatch 将根据需要启动新线程以继续工作,但它会产生多少新线程是有限制的。

关于swift - 如果在串行 DispatchQueue 中触发上下文切换会发生什么情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46551774/

相关文章:

c - 线程服务器,在客户端之间发送消息

iphone - 如何使用 GCD 在后台定期运行代码块?

ios - 无法更改 View Controller 属性的实例

swift - NSColor.init?(cgColor : aCGColor) ambiguous reference

java - HashMap 和可见性

c# - Parallel.ForEach 错误 : The query processor could not start the necessary thread resources for parallel query execution

ios - 如果我在 dispatch_async block 中有一个 dispatch_sync 调用,然后是第二个 dispatch 调用,那么第二个调用是同步还是异步有关系吗?

ios - 为选择 View Controller 创建导航栏标题图像会产生奇怪的行为

ios - 如何在应用程序后台循环调用 Rest Web 服务?

arrays - Swift - 处理字典字典的最佳方式?