ios 多线程中不管面试还是平常用到的死锁问题
1.互斥条件: 就是在进程中某个时间独占某一资源 可以认为 线程对相同的变量进行使用和释放
a用1,b用1,同时进行(暂定)
2.请求与保持条件:一个进程因为请求资源而阻塞时,对已经获得的资源进行占有
1资源和2资源(不可以剥夺) 线程a和b ,当a占有1资源,b占有2资源时,a的完成条件是用1资源和2资源顺序执行,b的完成条件是用2资源执行,当a执行时,b未完成时,a用到2资源时,b用不释放a用不到就会堵塞
3.不剥夺条件: 进程已获得资源,未完成之前不可剥夺
1资源和2资源(不可以剥夺) 线程a和b ,当a占有1资源,b占有2资源时,a的完成条件是用1资源和2资源顺序执行,b的完成条件是用2资源和1资源顺序执行,这两个线程只能完成一半,资源占有不可释放就死锁了
4.循环条件:若干进行之间形成循环
线程a和b相互等待对方从而获取资源形成的循环死锁
(使self对象在@synchronized(self){}中不会被其他线程调用和改变,起到了线程保护作用。)
例子当a和b 都执行这个方法时循环死锁@synchronized(self){
// 获取当前资源
// 等待资源另一个资源
// 线程被阻塞,等待另一个线程释放资源 }
一些例子:
NSLog(@"a");// 任务1
dispatch_sync(dispatch_get_main_queue(),^{
NSLog(@"b");// 任务2});
NSLog(@"c");// 任务3
打印结果是 a 后面就是主线程等待主线程直线完成 循环死锁
解决方法 dispatch_sync-----dispatch_async 会打印a、c、b
如果想顺序打印a、b、c,dispatch_get_main_queue----dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH,0) 主线程更改成子线程,这样就不会等待主线程完成在执行了(打印b的事件,不要是刷新UI等问题,更改UI这个必须是主线程)
dispatch_queue_t 线程名字=dispatch_queue_create("com.xxx.queue",DISPATCH_QUEUE_SERIAL);
dispatch_sync(线程名字,^{
NSLog(@"a");//打印a
dispatch_sync(线程名字,^{NSLog(@"b");//打印b});
NSLog(@"c");//打印c});
同步线程镶套进行打印 在打印b时崩溃,自己等待自己的问题。
如果想顺序打印b直接打印b去掉第二个镶套,同步串行就可以了,或者开启新队列在打印b的时候用信队列执行
如果不用顺序打印b,dispatch_sync------dispatch_async 异步执行就可以了 打印的是a、c、b
还有我们说的信号量堵塞问题(不常用不知道的需要百度了解一下)我看的这个(https://www.jianshu.com/p/50d137d2bb3f)