队列是调用者的参数。我想知道输入dispatch_queue_t的类型(串行或并发),因为我会以不同的方式处理它。
有可能吗?以及如何检查它?
答案 0 :(得分:13)
保证GCD中任意调用者提供的队列的序列化执行的惯用方法是创建自己的串行队列,并将调用者提供的队列设置为队列的目标队列(使用dispatch_set_target_queue(3)API)。 / p>
答案 1 :(得分:7)
如果您所拥有的只是“其他人”传递给您的dispatch_queue_t
,则您无法知道。这些信息实际上对您隐藏。如果您自己创建队列,则可以使用dispatch_queue_set_specific
和
dispatch_queue_get_specific
在队列的上下文数据中存储一个值,然后将其读回,但是如果你没有创建队列,那就太幸运了。
FWIW,这种暗示设计脆弱/反模式。将队列作为参数意味着您将调度块以便将来在该队列上执行。从这个角度来看,队列是并发还是串行都无关紧要。
更重要的是,您的代码应该被编写为无论是在串行还是并发队列上执行都无关紧要。如果它使用共享资源,那么它应该同步对这些资源的访问,这样如果要在并发队列上执行,那么访问这些资源将是安全的。相反,避免在串行队列上运行会出现问题(即不要尝试使用dispatch_sync
和可能是串行的队列来实现递归锁定。)