GCD学习——dispatch_sync

dispatch_sync
dispatch_async函数的”async”意味着”非同步”(asynchronous),就是将指定的Block”非同步”地追加到指定的Dispatch Queue中。dispatch_async不做任何等待。
dispatch_sync函数的”sync”意味着”同步”(synchronous),就是将指定的Block”同步”地追加到指定的Dispatch Queue中。在追加Block结束之前,dispatch_async会一直等待。
我们假设这样一种情况:执行Main Dispatch Queue时,使用另外的线程Global Dispatch Queue进行处理,处理结束后立即使用所得到的结果。在这种情况就要使用dispatch_sync函数。

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY,0);
dispatch_sync(queue,^{/*处理*/});

一旦调用dispatch_sync函数,那么在指定的处理执行结束之前,该函数不会返回。dispatch_sync函数可简化源代码,也可以说是简易版的dispatch_group_wait函数。
正因为dispatch_sync函数使用简单,所以也容易因为问题,即死锁。
例如如果在主线程中执行以下源代码就会死锁。

dispatch_queue_t queue = dispatch_get_main_queue();
dispatch_sync(queue,^{
   dispatch_sync(queue,^{NSLog(@"hello?");});
});

该源代码在Main Dispatch Queue即主线程中执行指定的Block,并等待其执行结束。而其实在主线程中正在执行这些源代码,所以无法执行追加到Main Dispatch Queue 的Block。

你可能感兴趣的:(同步,Dispatch,sync,gcd)