【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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:【Linux】posix版本的信号量
下一篇:【Linux】线程安全问题

发表评论

最新留言

路过按个爪印,很不错,赞一个!
[***.219.124.196]2024年09月20日 06时11分01秒