欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 养生 > 死锁例子学习

死锁例子学习

2024/11/30 20:29:08 来源:https://blog.csdn.net/huanting74/article/details/142268495  浏览:    关键词:死锁例子学习

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

1.介绍

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

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

产生死锁的四个必要条件

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

2.例子

#include <iostream>
#include <thread>
#include <mutex>
#include <chrono>std::mutex lock1;  // 对应 LOCK_1
std::mutex lock2;  // 对应 LOCK_2void threadA() {try {while (true) {std::lock_guard<std::mutex> guard1(lock1);  // 锁住 lock1std::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);  // 锁住 lock2std::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);  // 锁住 lock2std::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);  // 锁住 lock1std::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)等不到另一个锁时就释放已获取的锁。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com