What's the difference between the "global queue" and the "main queue" in GCD?

IphoneIosConcurrencyGrand Central-Dispatch

Iphone 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 :

  1. Tasks in concurrent queue executes concurrently [background threads]
  2. Tasks are still started in the order that they were added to the queue

Main dispatch queue :

  1. Available serial queue that executes tasks on the application's main thread.
  2. It is usually called from a background queue when some background processing has finished and the user interface needs to be updated.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionProud MemberView Question on Stackoverflow
Solution 1 - IphonemattjgallowayView Answer on Stackoverflow
Solution 2 - IphonejjrscottView Answer on Stackoverflow
Solution 3 - IphoneGrzegorz Adam HankiewiczView Answer on Stackoverflow
Solution 4 - IphoneLyju I EdwinsonView Answer on Stackoverflow