libdispatch不需要调用dispatch_main()
,它通过调度主队列主线程的runloop集成,见dispatch_get_main_queue(3)
和COMPATIBILITY
部分在其中。
不调用dispatch_main()
并且想要使用主队列的可执行文件必须以调度主队列上要处理的块的通用模式之一运行主线程runloop;通过标准框架方法(例如NSApplicationMain()
)或直接通过CFRunLoop或NSRunLoop API进行间接。
请不要试图使用_dispatch_main_queue_callback_4CF
符号,它是库内部的实现细节,将来很可能会发生更改,并且任何依赖它的代码都会在没有警告的情况下中断。
将libdispatch与自定义非主线程CFRunLoops集成可以通过多种方式实现,例如通过CFRunLoopPerformBlock()
API或自定义runloop源。
更新:在Linux上,你就必须修改libdispatch来源,有一个自定义的互操作没有现有的支持runloops AFAIK。
到主队列在Linux上现有的runloop整合最简单的方法可能是的确将是通过事件循环每次调用(最好改名)_dispatch_main_queue_callback_4CF()
功能,并更换 _dispatch_queue_wakeup_main()
用任何方法是适当的唤醒你的runloop(例如写入runloop正在等待的管道)。
来源
2012-04-24 05:30:49
das
我想在Linux系统上使用libdispatch(如果是NSRunLoop/CFRunLoop限制)。我想我应该在我原来的帖子中更清楚一点。我正在使用Debian libdispatch源代码(libkern/libpthread_workqueue/libkqueue)。 – Buzzy 2012-04-24 06:08:36
这完全正确。我自己也是到了类似的解决方案。万分感谢! – Buzzy 2012-04-24 07:11:11