1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
| // 死锁 - (void)interview01 { // 在主线程执行 interview01 // 队列先进先出 dispatch_queue_t queue = dispatch_get_main_queue(); // queue 队列 // interview01 在**主队列中**,执行 log123 需要上一个任务执行完毕, // 而上一个任务 interview01 执行完毕,又需要 log123 执行,因为是 sync 函数,必须里面在当前线程执行任务,执行完毕才能继续往下执行 dispatch_sync(queue, ^{ NSLog(@"123"); }); // dispatch_sync:立马在当前线程执行任务,执行完毕才能继续往下执行 } // 不会死锁 - (void)interview02 { // 在主线程执行 // 在主线程执行 NSLog(@"123"); dispatch_queue_t queue = dispatch_get_main_queue(); // 一定是 123 -> 1234 -> block 里面 // 都在主队列中,串行执行任务,由于 async 不会卡住,所以等 interview02 任务执行完,再执行 block 里面 dispatch_async(queue, ^{ NSLog(@"%@", [NSThread currentThread]); }); NSLog(@"1234"); // dispatch_async:不要求立马在当前线程同步执行任务 } // 会死锁 - (void)interview03 { // 在主线程执行 NSLog(@"1"); // 串行队列 dispatch_queue_t queue = dispatch_queue_create("com.gcd.myqueue", DISPATCH_QUEUE_SERIAL); // 开辟了线程 dispatch_async(queue, ^{ // 0 // 子线程执行 NSLog(@"2"); // 1 需要立马从串行队列 queue 拿出来执,但现在还在执行 0,0执行完的前提是1要执行,因为 1 是 sync 需要立马执行 dispatch_sync(queue, ^{ // 1 NSLog(@"3"); }); NSLog(@"4"); }); NSLog(@"5"); }
// 不会死锁 - (void)interview04 { // 在主线程执行 NSLog(@"1"); // 串行队列 dispatch_queue_t queue = dispatch_queue_create("com.gcd.myqueue", DISPATCH_QUEUE_SERIAL); // 并行 dispatch_queue_t queue2 = dispatch_queue_create("com.gcd.myqueue", DISPATCH_QUEUE_CONCURRENT); // 开辟了线程 dispatch_async(queue, ^{ // 0 // 子线程执行 NSLog(@"2"); // 不会开启线程 因为是 sync dispatch_sync(queue2, ^{ // 1 NSLog(@"3"); }); NSLog(@"4"); }); NSLog(@"5"); } // 不会死锁 - (void)interview05 { // 在主线程执行 NSLog(@"1"); // 串行队列 dispatch_queue_t queue = dispatch_queue_create("com.gcd.myqueue", DISPATCH_QUEUE_SERIAL); // 并行 dispatch_queue_t queue2 = dispatch_queue_create("com.gcd.myqueue", DISPATCH_QUEUE_CONCURRENT); // 开辟了线程 dispatch_async(queue, ^{ // 0 // 子线程执行 NSLog(@"2"); // 不会开启线程 因为是 sync,不会死锁因为是 并发队列一起执行,但一定是3先执行再执行4,因为sync同步需要立马拿出来执行 dispatch_sync(queue2, ^{ // 1 NSLog(@"3"); }); NSLog(@"4"); }); NSLog(@"5"); }
|