这两个调度队列有什么区别?
What is the difference between these two Dispatch Queues?
我在网上看到过这段代码
let highQueue = DispatchQueue.global(qos: .userInteractive)
let videoDataOutputQueue = DispatchQueue(label: "com.apple.sample.capturepipeline.video", attributes: [], target: highQueue)
第二个以第一个为目标
它们之间的技术区别是什么?不都是并发的高优先级队列吗???
有一个巨大的区别:全局队列是并发的,而您的视频队列是串行的。
如果你直接提交两个块到全局队列,系统允许同时运行它们。
如果您向视频队列提交两个块,系统必须 运行 按顺序(而不是同时)提交它们。您提交的第一个块必须 return 才能允许队列调用第二个块。这意味着您可以将视频队列用作 serialization/locking 机制,以线程安全的方式访问状态。
我知道的其他差异:
在 Xcode 的调试导航器中,队列的标签不同。
您可以设置您创建的视频队列的自动释放频率。
如果您在创建视频队列时设置服务质量 class,该 QoS 将覆盖目标队列的 QoS。
您可以暂停和恢复视频队列的调度。我不确定 suspend
和 resume
是否适用于全局队列,但如果它们适用,我确定暂停全局队列是一个 糟糕的 想法.您不知道系统可能在全局队列中排队的重要任务。
您可以 setSpecific
视频队列中的值,然后使用 getSpecific
在排队到视频队列的块中访问它们。但是 getSpecific
不会 return 那些块中的值直接排队到全局队列中。出于线程安全原因,这最常用于检测何时对特定队列进行 API 调用。
我在网上看到过这段代码
let highQueue = DispatchQueue.global(qos: .userInteractive)
let videoDataOutputQueue = DispatchQueue(label: "com.apple.sample.capturepipeline.video", attributes: [], target: highQueue)
第二个以第一个为目标
它们之间的技术区别是什么?不都是并发的高优先级队列吗???
有一个巨大的区别:全局队列是并发的,而您的视频队列是串行的。
如果你直接提交两个块到全局队列,系统允许同时运行它们。
如果您向视频队列提交两个块,系统必须 运行 按顺序(而不是同时)提交它们。您提交的第一个块必须 return 才能允许队列调用第二个块。这意味着您可以将视频队列用作 serialization/locking 机制,以线程安全的方式访问状态。
我知道的其他差异:
在 Xcode 的调试导航器中,队列的标签不同。
您可以设置您创建的视频队列的自动释放频率。
如果您在创建视频队列时设置服务质量 class,该 QoS 将覆盖目标队列的 QoS。
您可以暂停和恢复视频队列的调度。我不确定
suspend
和resume
是否适用于全局队列,但如果它们适用,我确定暂停全局队列是一个 糟糕的 想法.您不知道系统可能在全局队列中排队的重要任务。您可以
setSpecific
视频队列中的值,然后使用getSpecific
在排队到视频队列的块中访问它们。但是getSpecific
不会 return 那些块中的值直接排队到全局队列中。出于线程安全原因,这最常用于检测何时对特定队列进行 API 调用。