dispatch_sync may result in dead-lock

以下代码会引起死锁

 1  dispatch_block_t block = ^{
 2         for (int i = 0; i < 100; i++) {
 3             NSLog(@"dispatch_sync:%d", i);
 4         }
 5     };
 6     
 7     dispatch_queue_t queue = dispatch_queue_create("FIFO.QUEQE", 0);
 8     dispatch_async(queue, block);
 9 
10     NSLog(@"finish dispatch_asyn");
11     
12     dispatch_sync(dispatch_get_main_queue(), ^{
13         NSLog(@"sync");
14     });
15     
16     NSLog(@"finish dispatch_sync");
View Code

Apple的官方文档中这么描述:Calls to dispatch_sync() targeting the current queue will result in dead-lock.

为什么会发生死锁呢?

当在主线程中执行第一个block时,它没有将控制权返回给当前线程,即主线程;然后又尝试在主线程中执行第二个block,此时主线程会一直等待queue完成,因而形成死锁

posted @ 2013-09-02 13:34  Kalou  阅读(426)  评论(0编辑  收藏  举报