1、
dispatch_queue_t queue = dispatch_queue_create("shddj", DISPATCH_QUEUE_SERIAL);
dispatch_async(queue, ^{
NSLog(@"1");
dispatch_sync(queue, ^{
NSLog(@"2");
});
NSLog(@"3");
});
生成一个串行队列,队列中的block按照先进先出(FIFO)的顺序去执行,实际上为单线程执行。第一个block异步添加到穿行队列,先打印 “1”,然后同步向串行队列添加第二个block,造成线程阻塞,即死锁,程序崩溃;
2、
dispatch_queue_t queue = dispatch_queue_create("concurrent_queue", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{
NSLog(@"1");
dispatch_sync(queue, ^{
NSLog(@"2");
});
NSLog(@"3");
});
NSLog(@"4");
while (1) { }
NSLog(@"5");
生成一个并发队列,并异步添加最外层block到并发队列,主线程在添加完继续执行 NSLog(@"4"),因为 NSLog(@"2") 是同步任务,要在执行完 NSLog(@"2") 采取执行 NSLog(@"3");
网友评论