12

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

是否可以?以及如何检查?

4

2 回答 2

16

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

于 2013-01-21T01:06:00.033 回答
9

如果你所拥有的只是dispatch_queue_t“别人”传给你的,那么你就无法知道。该信息实际上对您隐藏。如果您自己创建队列,那么您可以使用dispatch_queue_set_specificand dispatch_queue_get_specific在队列的上下文数据中存储一个值,然后将其读回,但如果您不创建队列,那么您就不走运了。

FWIW,这种暗示了脆弱的设计/反模式。将队列作为参数意味着您将安排块以供将来在该队列上执行。从这个角度来看,队列是并发的还是串行的并不重要。

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

于 2013-01-19T19:21:32.960 回答