【Linux】死锁
发布日期:2021-05-10 06:33:37
浏览次数:19
分类:技术文章
本文共 1509 字,大约阅读时间需要 5 分钟。
1.死锁
-
当多个执行流使用同一个互斥锁的时候,有一个执行流获取到互斥锁之后,但是没有释放互斥锁,导致其他执行流卡死在加锁的接口中,我们称之为这种现象叫死锁
-
多个执行流,在多个互斥锁的情况下,每一个执行流都占有一把互斥锁,但是还要申请对方的互斥锁,这种情况下,就会导致各个执行流阻塞掉,这种现象称之为死锁
#include#include #include #define THREADCOUNT 1pthread_mutex_t lock1;pthread_mutex_t lock2;void* Threadlock1(void* arg){ (void)arg; pthread_mutex_lock(&lock1); sleep(2); pthread_mutex_lock(&lock2); pthread_mutex_unlock(&lock2); pthread_mutex_unlock(&lock1); return NULL;}void* Threadlock2(void* arg){ (void)arg; pthread_mutex_lock(&lock2); sleep(2); pthread_mutex_lock(&lock1); pthread_mutex_unlock(&lock1); pthread_mutex_unlock(&lock2); return NULL;}int main(){ pthread_mutex_init(&lock1, NULL); pthread_mutex_init(&lock2, NULL); pthread_t tid1[THREADCOUNT], tid2[THREADCOUNT]; for(int i = 0; i < THREADCOUNT; i++) { int ret = pthread_create(&tid1[i], NULL, Threadlock1, NULL); if(ret < 0) { perror("thread1 error!\n"); return -1; } ret = pthread_create(&tid1[i], NULL, Threadlock2, NULL); if(ret < 0) { perror("thread2 error!\n"); return -1; } } sleep(3); for(int i = 0; i < THREADCOUNT; i++) { pthread_join(tid1[i], NULL); pthread_join(tid2[i], NULL); } pthread_mutex_destroy(&lock1); pthread_mutex_destroy(&lock2); return 0;}
2.操作
- gdb:查看多线程的调用堆栈:thread apply all bt
- t [线程编号] :跳转到具体线程的堆栈中
- f [堆栈编号] :跳转到具体的某一个堆栈当中去
3.死锁必备条件
- 互斥条件
- 请求与保持联系(吃着碗里的,看着锅里的)
- 不可剥夺条件
- 循环等待
4.防止死锁
- 破坏必要条件
- 加锁顺序一致
- 不要忘记解锁,在所有的可能导致执行流退出的地方进行解锁
转载地址:https://blog.csdn.net/weixin_43967449/article/details/110355279 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
路过按个爪印,很不错,赞一个!
[***.219.124.196]2024年09月20日 06时11分01秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Summary: gcd最大公约数、lcm最小公倍数算法
2019-06-07
JS实现HashMap
2019-06-07
linux mysql
2019-06-07
android 68 单元测试
2019-06-07
centos 6.3 64位安装php5.5及配置tengine
2019-06-07
进入页面就触发了popstate事件。
2019-06-07
AntDesign vue学习笔记(六)Table 显示图片
2019-06-07
Bootstrap框架(基础篇)之按钮,网格,导航栏,下拉菜单
2019-06-07
day16 Python 类的关联关系
2019-06-07
本地win8系统部署网站遇到的问题
2019-06-07
MySQL安装,启动
2019-06-07
JAVA基础知识总结
2019-06-07
UVA 101 - The Blocks Problem(模拟)
2019-06-07
《番茄工作法图解》第二章阅读笔记
2019-06-07
Java提升代码性能整理
2019-06-07
[洛谷P1017] 进制转换
2019-06-07
luogu 2257 YY的GCD
2019-06-07
看图写话
2019-06-07
Java接口自动化测试TestNG
2019-06-07