如何检测调度队列的类型(串口还是并发)?

tee*_*pap 7 grand-central-dispatch ios

队列是来自调用者的参数.我想知道输入dispatch_queue_t的类型(串行或并发),因为我将以不同的方式处理它.

可能吗?以及如何检查?

das*_*das 14

保证GCD中任意调用者提供的队列上的序列化执行的惯用方法是创建自己的串行队列,并将调用者提供的队列设置为队列的目标队列(使用dispatch_set_target_queue(3)API).


ipm*_*mcc 7

如果你拥有的是dispatch_queue_t"其他人"传递给你的,那么你就无法知道.这些信息实际上对您隐藏.如果您自己创建队列,那么您可以使用dispatch_queue_set_specificdispatch_queue_get_specific存储队列的上下文数据中的值,然后将其读回,但如果您没有创建队列,那么您将失去运气.

FWIW,这种暗示设计脆弱/反模式.将队列作为参数意味着您将调度块以便将来在该队列上执行.从这个角度来看,队列是并发还是串行都无关紧要.

更重要的是,您的代码应该被编写为无论是在串行还是并发队列上执行都无关紧要.如果它使用共享资源,那么它应该同步对这些资源的访问,这样如果要在并发队列上执行,那么访问这些资源将是安全的.相反,避免在串行队列上运行会出现问题的情况(即不要尝试通过使用dispatch_sync可能是串行的队列来实现递归锁定.)