所以我正在阅读Facebook的精彩 AsyncDisplayKit 源代码。具体来说,我正在阅读 ASDealloc2MainObject 背后的实现。有一件事引起了我的注意。
在_AS-objc-internal.h, line 423 to 424中,程序员将一些任务分派到主队列中。
dispatch_barrier_async_f(dispatch_get_main_queue(), self, \
_objc_deallocOnMainThreadHelper); \
与其他调度屏障函数的情况一样,dispatch_barrier_async_f()
的屏障逻辑只有在处理自定义并发队列时才有意义。对于全局并发队列和主队列,它的行为与dispatch_async_f()
一样,屏障无效。
为什么在这里使用障碍?
答案 0 :(得分:2)
这对我来说似乎是个错误。最好的情况是,他们试图表达意图,并提醒程序员“嘿,这件事是串行的”,但这看起来很可疑。
答案 1 :(得分:0)
所以我找到了一个可能的解释:如果传入的队列的并发宽度设置为1,则dispatch_async_f()
调用dispatch_barrier_async_f()
。
dispatch_async_f()
的{{3}}如下所示:
DISPATCH_NOINLINE
void
dispatch_async_f(dispatch_queue_t dq, void *ctxt, dispatch_function_t func)
{
dispatch_continuation_t dc;
// No fastpath/slowpath hint because we simply don't know
if (dq->dq_width == 1) {
return dispatch_barrier_async_f(dq, ctxt, func);
}
dc = fastpath(_dispatch_continuation_alloc_cacheonly());
if (!dc) {
return _dispatch_async_f_slow(dq, ctxt, func);
}
dc->do_vtable = (void *)DISPATCH_OBJ_ASYNC_BIT;
dc->dc_func = func;
dc->dc_ctxt = ctxt;
// No fastpath/slowpath hint because we simply don't know
if (dq->do_targetq) {
return _dispatch_async_f2(dq, dc);
}
_dispatch_queue_push(dq, dc);
}