gpt4 book ai didi

ios - serial Dispatch Queue 将只使用一个线程?

转载 作者:行者123 更新时间:2023-12-01 16:08:12 26 4
gpt4 key购买 nike

我发现串行队列会使用多个线程来运行异步代码。这是 playground 中的测试代码。

import Foundation  

let q = DispatchQueue(label: "test")
q.async {
print("hi \(Thread.current)")
}
q.async {
print("hi \(Thread.current)")
}
q.async {
print("hi \(Thread.current)")
}
q.async {
print("hi \(Thread.current)")
}
q.async {
print("hi \(Thread.current)")
}

当我反复执行playground时,有时会有这样的输出。在我的理解中,串行队列应该只使用一个线程,但日志显示它使用了 2 个线程。我真的很困惑。什么是正确的行为?

hi <NSThread: 0x7fc26a467b90>{number = 2, name = (null)}  
hi <NSThread: 0x7fc26a467b90>{number = 2, name = (null)}
hi <NSThread: 0x7fc26a467b90>{number = 2, name = (null)}
hi <NSThread: 0x7fc26a467b90>{number = 2, name = (null)}
hi <NSThread: 0x7fc26b1003e0>{number = 3, name = (null)}

最佳答案

你说串行队列在“一次”时间只使用一个线程是对的。

但是同一个线程(NSThread 对象)会执行每个排入队列的代码块吗?没有。

为了使第一个陈述更加清晰,我将重新措辞......

串行队列每次执行 block 时只会使用 1 个线程。这意味着两个线程永远不会在任何时间点对任何代码块进行操作。

无法保证哪个线程执行从队列中入队/出队的 FIFO 顺序的代码。但可以保证任何“一个”任意工作线程都将执行该操作。

据我所知,在内部,对于每个 block ,线程分配是自动的。 “只有一个线程”并不意味着“总是相同的线程”。

关于ios - serial Dispatch Queue 将只使用一个线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51057441/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com