死锁例子学习

转自: 面试官:什么是死锁?如何解决死锁?写一段死锁的代码吧!_哈工大分出了多少学校-CSDN博客

1.介绍

。产生死锁的原因,主要包括:

  • 系统资源不足;如果系统资源充足,进程的资源请求都能够得到满足,那么死锁出现的可能性就很低;否则就会因争夺有限的资源而陷入死锁。
  • 程序执行的顺序有问题;
  • 资源分配不当等。

产生死锁的四个必要条件

  1. 互斥条件:一个资源每次只能被一个进程使用。
  2. 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
  3. 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
  4. 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
     

2.例子

#include <iostream>
#include <thread>
#include <mutex>
#include <chrono>

std::mutex lock1;  // 对应 LOCK_1
std::mutex lock2;  // 对应 LOCK_2

void threadA() {
    try {
        while (true) {
            std::lock_guard<std::mutex> guard1(lock1);  // 锁住 lock1
            std::cout << std::this_thread::get_id() << " 锁住 lock1" << std::endl;
            std::this_thread::sleep_for(std::chrono::seconds(1));
            
            std::lock_guard<std::mutex> guard2(lock2);  // 锁住 lock2
            std::cout << std::this_thread::get_id() << " 锁住 lock2" << std::endl;
        }
    } catch (const std::exception& e) {
        std::cerr << "Exception in threadA: " << e.what() << std::endl;
    }
}

void threadB() {
    try {
        while (true) {
            std::lock_guard<std::mutex> guard2(lock2);  // 锁住 lock2
            std::cout << std::this_thread::get_id() << " 锁住 lock2" << std::endl;
            std::this_thread::sleep_for(std::chrono::seconds(1));
            
            std::lock_guard<std::mutex> guard1(lock1);  // 锁住 lock1
            std::cout << std::this_thread::get_id() << " 锁住 lock1" << std::endl;
        }
    } catch (const std::exception& e) {
        std::cerr << "Exception in threadB: " << e.what() << std::endl;
    }
}

int main() {
    std::thread t1(threadA);
    std::thread t2(threadB);

    t1.join();
    t2.join();

    return 0;
}

解决方案: 1)修改加锁顺序一致。2)等不到另一个锁时就释放已获取的锁。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值