ios 关于线程死锁的问题

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)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容