两个线程,两个互斥锁,怎么形成一个死循环?
问题描述: 两个互斥锁 , 怎么形成一个死循环?
文章插图
粉丝的提问 , 必须安排 。
两个线程 , 两个互斥锁如何形成死锁?程序流程图如下:
文章插图
如上图所示:
- t0时刻 , 主线程创建子线程 , 并初始化互斥锁mutex1、mutex2;
- t1时刻 , 主线程申请到了mutex1、子线程申请到了mutex2;
- t2时刻 , 主线程和子线程都sleep 1秒钟 , 防止优先获得时间片的线程直接申请到了另外1个互斥锁 , 导致程序直接退出;
- t3时刻 , 主线程和子线程都想获得对方手里的互斥锁 , 但是对方都来不及释放自己手里的锁;
- t4时刻 , 主线程和子线双双进入休眠 。
文章插图
死锁
源码如下
#include #include #include #includeunsigned int value1, value2, count;pthread_mutex_tmutex1,mutex2;void *function(void *arg);void*function(void *arg){ pthread_mutex_lock( printf("new thread get mutex2\n");sleep(1); pthread_mutex_lock(printf("new thread get mutex1\n");pthread_mutex_unlock( printf("new thread release mutex1\n"); pthread_mutex_unlock(printf("new thread release mutex2\n");returnNULL; }int main(int argc,char *argv[]){ pthread_ta_thread;if (pthread_mutex_init(exit(-1); }if (pthread_mutex_init(exit(-1); }if (pthread_create(exit(-1); }while ( 1 ){pthread_mutex_lock(printf("main thread get mutex1\n");sleep(1);pthread_mutex_lock(printf("main thread get mutex2\n");pthread_mutex_unlock(printf("main thread release mutex2\n");pthread_mutex_unlock(printf("main thread release mutex1\n");}return 0; }
编译运行文章插图
从执行结果可以判断 , 主线程和子线程分别获得了互斥锁mutex1、mutex2,sleep 1秒后 , 他们都想再分别申请mutex2、mutex1 , 而双方都不想释放自己手中的锁 , 锁已形成了死锁 , 程序就一直处于休眠状态 。
查看下该进程的线程查看进程ID , 为4204
文章插图
查看该进程创建的线程id:4204、4205 。
文章插图
更多嵌入式linux 知识 请关注:一口Linux
- sd|sd卡修复工具有哪些?两个办法就可以搞定了
- 硬盘|七八年前的电脑,运行速度缓慢,卡顿,更换两个硬件就能快如闪电
- 分析师|真香定律或再被验证,iPhone12将大卖,分析师给出两个原因
- 外卖|两个外卖小伙为抢单大打出手,当看到他们的招式后,网友:屈才了
- 内蒙古自治区云计算领域启动两个科技重大专项
- 为什么 Redis 单线程能支撑高并发?
- 「8」进大厂必须掌握的面试题-Java面试-异常和线程
- 历时两个月终拿下京东offer,学习笔记全在这儿了
- 微信能设置两个头像了,快试试
- 重磅!微信更新的这两个新功能,办公室同事直呼过瘾