title: Does a GCD dispatch_async wait on NSLog()?
body: <p>From what I've read about Grand Central Dispatch, GCD does not do preemptive multitasking; it is all a single event loop.  I'm having trouble making sense of this output.  I have two queues just doing some output (at first I was reading/writing some shared state, but I was able to simplify down to this and still get the same result).</p>
  
  <pre><code>dispatch_queue_t authQueue = dispatch_queue_create("authQueue", DISPATCH_QUEUE_SERIAL);
  dispatch_queue_t authQueue2 = dispatch_queue_create("authQueue", DISPATCH_QUEUE_SERIAL);
  
  dispatch_async(authQueue, ^{ 
      NSLog(@"First Block");
      NSLog(@"First Block Incrementing"); 
      NSLog(@"First Block Incremented"); 
  });
  
  dispatch_async(authQueue, ^{ 
      NSLog(@"Second Block");
      NSLog(@"Second Block Incrementing");
      NSLog(@"Second Block Incremented"); 
  });
  
  dispatch_async(authQueue2,^{ 
      NSLog(@"Third Block"); 
      NSLog(@"Third Block Incrementing");
      NSLog(@"Third Block Incremented"); 
  });
  </code></pre>
  
  <p>I get the following output:</p>
  
  <pre><code>2011-12-15 13:47:17.746 App[80376:5d03] Third Block
  2011-12-15 13:47:17.746 App[80376:1503] First Block
  2011-12-15 13:47:17.746 App[80376:5d03] Third Block Incrementing
  2011-12-15 13:47:17.746 App[80376:1503] First Block Incrementing
  2011-12-15 13:47:17.748 App[80376:1503] First Block Incremented
  2011-12-15 13:47:17.748 App[80376:5d03] Third Block Incremented
  2011-12-15 13:47:17.750 App[80376:1503] Second Block
  2011-12-15 13:47:17.750 App[80376:1503] Second Block Incrementing
  2011-12-15 13:47:17.751 App[80376:1503] Second Block Incremented
  </code></pre>
  
  <p>As is evident, the blocks do not execute atomically. My only theory is that GCD writing to stdio via NSLog makes the current execution wait.  I can't find anything related to this in the Apple documentation. Can anyone explain this?</p>