What's the difference between the "global queue" and the "main queue" in GCD?
IphoneIosConcurrencyGrand Central-DispatchIphone Problem Overview
Among some other ways, there are these two ways to get queues in GCD
:
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_get_main_queue();
If I'm not completely wrong, the "main queue" is executing on the main thread and is good for "callback" blocks which execute UI work.
Does this mean a "global queue" is one that runs on a background thread?
Iphone Solutions
Solution 1 - Iphone
The main queue does indeed run on the main thread like you say.
The global queues are concurrent queues and from the main page for dispatch_get_global_queue:
> Unlike the main queue or queues allocated with > dispatch_queue_create(), the global concurrent queues > schedule blocks as soon as threads become available ("non-FIFO" completion order). The global concurrent > queues represent three priority bands: > > • DISPATCH_QUEUE_PRIORITY_HIGH > • DISPATCH_QUEUE_PRIORITY_DEFAULT > • DISPATCH_QUEUE_PRIORITY_LOW > > Blocks submitted to the high priority global queue will be invoked before those submitted to the > default or low priority global queues. Blocks submitted to the low priority global queue will only be > invoked if no blocks are pending on the default or high priority queues.
So, they are queues which run on background threads as and when they become available. They're "non-FIFO" so ordering is not guaranteed.
Solution 2 - Iphone
The 5 queues (4 background, 1 main) all have different thread priorities (-[NSThread threadPriority]
) too:
-main- : 0.758065
DISPATCH_QUEUE_PRIORITY_HIGH : 0.532258
DISPATCH_QUEUE_PRIORITY_DEFAULT : 0.500000
DISPATCH_QUEUE_PRIORITY_LOW : 0.467742
DISPATCH_QUEUE_PRIORITY_BACKGROUND : 0.000000
(tested on an iPod 4th gen and the simulator on a MacBook Pro)
Solution 3 - Iphone
Yes. You can run code like this on a device to test it:
dispatch_async(
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSLog(@"Block 1a");
NSAssert(![NSThread isMainThread], @"Wrong thread!");
NSLog(@"Block 1b");
});
dispatch_async(
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"Block 2a");
NSAssert([NSThread isMainThread], @"Wrong thread!");
NSLog(@"Block 2b");
});
});
Solution 4 - Iphone
Global dispatch queue :
- Tasks in concurrent queue executes concurrently [background threads]
- Tasks are still started in the order that they were added to the queue
Main dispatch queue :
- Available serial queue that executes tasks on the application's main thread.
- It is usually called from a background queue when some background processing has finished and the user interface needs to be updated.