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

Neo*_*ang 1 multithreading grand-central-dispatch swift 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")
}
Run Code Online (Sandbox Code Playgroud)

结果是:

// IN 1 -> OUT of 1 -> IN 2 ?
// or IN 1 -> IN 2 -> OUT of 1 ?
Run Code Online (Sandbox Code Playgroud)

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

Lil*_*ard 5

串行队列在前一个块完成之前不会开始执行下一个块。上下文切换对此没有影响。如果您调用sleep提交到串行队列的块,这将阻塞队列,直到睡眠完成并且您的块可以继续执行。所以你的结果将是IN 1 -> OUT of 1 -> IN 2.

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