[libdispatch-dev] Regarding dispatch_get_main_queue() and the thread it is actual executing on

Dave Zarzycki zarzycki at apple.com
Tue Apr 19 11:19:45 PDT 2011


On Apr 19, 2011, at 11:04 AM, Marius Zwicker wrote:

> 
> Am 19.04.2011 um 18:27 schrieb Dave Zarzycki:
> 
>> 
>> On Apr 19, 2011, at 9:09 AM, Dave Zarzycki wrote:
>> 
>>> On Apr 19, 2011, at 8:07 AM, Marius Zwicker wrote:
>>> 
>>>> I thought the main queue is available as a mean to be sure some blocks execute on the main thread (e.g. when updating the GUI is only possible while being on the main thread).
>>> 
>>> 
>>> Marius,
>>> 
>>> That is only true if-and-only-if GCD is working in compatibility mode with Cocoa GUI logic, which for legacy reasons is bound to the main thread. If dispatch_main() is called, then GCD turns the main queue into a normal serial queue, with all of the performance advantages thereof.
>> 
>> P.S. – This is covered in the dispatch_main() man page:
>> 
>> COMPATIBILITY
>>      Cocoa applications need not call dispatch_main().  Blocks submitted to
>>      the main queue will be executed as part of the "common modes" of the
>>      application's main NSRunLoop or CFRunLoop.  However, blocks submitted to
>>      the main queue in applications using dispatch_main() are not guaranteed
>>      to execute on the main thread.
> 
> Thanks a lot for the information. I will try to implement similar functionality when using gui frameworks needing a "real" main thread as well. I assume the portions you were talking about can be found when searching for the DISPATCH_COCOA_COMPAT macro.

Marius,

Indeed! :-)

In short, we worked with our GUI team to have a kernel handle (in this case a Mach port, but it could easily be a Unix descriptor too). When that handle receives a message (or becomes readable in the case of a Unix descriptor), then they promise to call _dispatch_main_queue_callback_4CF() where CF is the common shorthand for the name of the library calling this API. You'd want to add your own equivalent with whatever arguments make sense. For example: _dispatch_main_queue_callback_4{GTK,KDE,X11,etc}(). We use the _4[A-Z][A-Z0-9*] suffix style to signify one-to-one contracts with other subsystems, and not general purpose API.

davez

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/libdispatch-dev/attachments/20110419/ce45889d/attachment.html>


More information about the libdispatch-dev mailing list