死锁
-
什么是死锁?
- 在当前队列中, 追加一个任务; 如果使用同步函数, 则在当前线程中执行源代码, 与等待执行追加的block任务产生冲突, 造成死锁
-
sample code
dispatch_queue_t queue = dispatch_get_main_queue() // 该步, 造成死锁 dispatch_sync(queue, ^{ // block1 NSLog(@"do something"); }); // 原因`dispatch_sync`阻塞当前线程, 等待追加的block1执行完;才会往下执行 // 但是当前线程中, 又在执行源代码; 即把block1追加到queue队列中; // 故两者卡死;
dispatch_queue_t queue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_SERIAL); dispatch_async(queue, ^{ NSLog(@"%@", [NSThread currentThread]); // 该步, 造成死锁 dispatch_sync(queue, ^{ NSLog(@"do something"); }); }); // 原因`dispatch_sync`阻塞当前线程 // 当前线程在执行追加block到队列源代码, 且block又在当前线程执行
dispatch_queue_t queue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_SERIAL); dispatch_async(queue, ^{ // <NSThread: 0x608000263000>{number = 3, name = (null)} NSLog(@"%@", [NSThread currentThread]); dispatch_queue_t queue2 = dispatch_queue_create("myQueue", DISPATCH_QUEUE_SERIAL); dispatch_sync(queue2, ^{ // <NSThread: 0x608000263000>{number = 3, name = (null)} NSLog(@"%@", [NSThread currentThread]); NSLog(@"do something"); }); NSLog(@"sss"); }); // 上面是同一线程, 且是同步函数但没有死锁; // 原因是, 任务执行的队列不一样
-
故造成死锁的两个条件
- 使用
同步函数
- 执行的
多个任务
的队列
是同一队列
- 使用
网友评论