当前位置: 首页 > news >正文

快速网站建设多少钱设计公司取名字大全集

快速网站建设多少钱,设计公司取名字大全集,企业网站开发论文,遵义网站建设制作公司定义 死锁是指两个或多个线程互相持有对方所需的资源,从而导致它们无法继续执行的情况。如下图所示,现有两个线程,分别是线程A及线程B,线程A持有锁A,线程B持有锁B。此时线程A想获取锁B,但锁B需等到线程B的结…

定义

        死锁是指两个或多个线程互相持有对方所需的资源,从而导致它们无法继续执行的情况。如下图所示,现有两个线程,分别是线程A及线程B,线程A持有锁A,线程B持有锁B。此时线程A想获取锁B,但锁B需等到线程B的结束才能解锁;而线程B想获取锁A,但锁A需等到线程A的结束才能解锁,这样就造成了线程A等线程B,线程B等线程A,从而出现死锁。

图解两线程死锁现象

c++死锁示例 

#include <iostream>
#include <thread>
#include <mutex>std::mutex mutexA;
std::mutex mutexB;void ThreadA()
{std::unique_lock<std::mutex> lockA(mutexA);std::this_thread::sleep_for(std::chrono::milliseconds(100));  // 为了增加发生死锁的概率,让线程A先获取锁A再休眠一段时间std::cout << "Thread A acquired mutex A" << std::endl;std::unique_lock<std::mutex> lockB(mutexB);std::cout << "Thread A acquired mutex B" << std::endl;// 执行操作...lockB.unlock();lockA.unlock();
}void ThreadB()
{std::unique_lock<std::mutex> lockB(mutexB);std::cout << "Thread B acquired mutex B" << std::endl;std::unique_lock<std::mutex> lockA(mutexA);std::cout << "Thread B acquired mutex A" << std::endl;// 执行操作...lockA.unlock();lockB.unlock();
}int main()
{std::thread threadA(ThreadA);std::thread threadB(ThreadB);threadA.join();threadB.join();return 0;
}

输出结果:(程序中止崩溃)

分析: 

        在上述代码中,有两个线程(ThreadA和ThreadB),它们都试图以不同的顺序获取两个互斥锁(mutexA和mutexB)。如果ThreadA先获取了mutexA,然后尝试获取mutexB,而ThreadB先获取了mutexB,然后尝试获取mutexA,那么就会发生死锁。

        当ThreadA获取了mutexA后,它会休眠一段时间。在此期间,ThreadB获取了mutexB。接着,ThreadA试图获取mutexB时会被阻塞,因为ThreadB持有mutexB。同时,ThreadB也试图获取mutexA时会被阻塞,因为ThreadA持有mutexA。这样,两个线程都无法继续执行,导致程序陷入死锁状态。

        需要注意的是,死锁不一定会在每次运行时都发生,它取决于线程的调度和执行顺序。如果在实际应用中遇到死锁问题,可以通过合理的锁顺序、避免嵌套锁、使用死锁检测等方法来预防和解决死锁。

c++解决死锁

修改上述代码,使用std::lock函数来避免死锁:

#include <iostream>
#include <thread>
#include <mutex>std::mutex mutexA;
std::mutex mutexB;void ThreadA()
{std::unique_lock<std::mutex> lockA(mutexA, std::defer_lock);std::this_thread::sleep_for(std::chrono::milliseconds(100));std::cout << "Thread A acquired mutex A" << std::endl;std::unique_lock<std::mutex> lockB(mutexB, std::defer_lock);std::cout << "Thread A acquired mutex B" << std::endl;std::lock(lockA, lockB);  // 使用std::lock同时获取两个锁// 执行操作...lockB.unlock();lockA.unlock();
}void ThreadB()
{std::unique_lock<std::mutex> lockB(mutexB, std::defer_lock);std::cout << "Thread B acquired mutex B" << std::endl;std::unique_lock<std::mutex> lockA(mutexA, std::defer_lock);std::cout << "Thread B acquired mutex A" << std::endl;std::lock(lockA, lockB);  // 使用std::lock同时获取两个锁// 执行操作...lockA.unlock();lockB.unlock();
}int main()
{std::thread threadA(ThreadA);std::thread threadB(ThreadB);threadA.join();threadB.join();return 0;
}

输出结果:(正确结果)

分析:

        在修改后的代码中,使用std::defer_lock参数来延迟锁的获取,而不是在构造std::unique_lock对象时立即获取锁。然后,在需要同时获取两个锁的地方,使用std::lock函数来获取锁,这样可以避免死锁发生。

        需要注意的是,虽然上述方法可以解决死锁问题,但在实际编程中,应尽量避免复杂的锁依赖关系和嵌套锁的使用,以减少死锁的可能性。

产生死锁的原因

竞争不可抢占资源(互斥资源)
线程推进顺序不当

产生死锁的四个必要条件

  1. 互斥条件(Mutual Exclusion):至少有一个资源同时只能被一个进程或线程占用,即在一段时间内只能有一个进程或线程访问该资源。

  2. 请求与保持条件(Hold and Wait):进程或线程在持有至少一个资源的同时,又请求其他进程或线程所持有的资源。

  3. 不可剥夺条件(No Preemption):已经分配给一个进程或线程的资源不能被强制性地剥夺,只能由持有资源的进程或线程显式地释放。

  4. 循环等待条件(Circular Wait):存在一个进程或线程的资源请求序列,使得每个进程或线程都在等待下一个进程或线程所持有的资源。

当这四个条件同时满足时,就可能发生死锁。

例如,考虑以下场景:

  • 进程A持有资源X,并请求资源Y。
  • 进程B持有资源Y,并请求资源X。

        如果进程A和进程B同时运行,并且它们按照上述顺序获取和释放资源,那么就会出现死锁。进程A持有资源X,进程B持有资源Y,但它们互相需要对方持有的资源才能继续执行,导致两个进程都无法继续执行下去。

处理死锁的方法

(1)预防死锁(破坏四条件)

  1. 破坏互斥条件:例如,对于某些资源,引入共享访问的机制,使得多个进程或线程可以同时访问资源。

  2. 破坏请求与保持条件:要求进程在请求资源之前释放已经持有的资源,或者一次性请求所有需要的资源。

  3. 破坏不可剥夺条件:引入资源预约和强制剥夺机制,以确保资源可以被其他进程或线程使用。

  4. 破坏循环等待条件:通过定义资源的线性顺序,要求进程按照相同的顺序请求资源,从而避免循环等待。

(2)避免死锁(银行家算法)

 

http://www.khdw.cn/news/16983.html

相关文章:

  • 网站预订功能怎么做百度做广告推广怎么样
  • 桂林网南昌seo代理商
  • b2b平台网站源码网站链接分析工具
  • 深圳有实力的网站建设服务商关键词优化推广排名软件
  • 设计图标logoseo关键词快速获得排名
  • 网站建设webmeng百度青岛代理公司
  • 打电话来说做网站_然后答应了重庆网络推广专员
  • 万荣网站建设seo是什么软件
  • 做普通网站需要多少钱优化关键词首页排行榜
  • wordpress 移除菜单搜索引擎优化的分类
  • 建设工程业绩补录 网站网站开发与设计
  • 手机网站怎么做的好处北京网站优化经理
  • 网站制作全包多少钱2023年12月疫情又开始了吗
  • 山东省住房和城乡建设厅焊工证优化方案的格式及范文
  • 怎么把网站改为正在建设中seo sem是什么
  • 建设学分银行网站策划书新网站如何快速收录
  • 郑州网站制作计划seo优化网站快速排名
  • 北京正规网站建设比较广告关键词有哪些
  • 哲学专业特色建设网站seo短视频
  • 搭建网站内链系统谷歌网站优化推广
  • 做汽车微信广告视频网站有哪些友情链接推广平台
  • 网站每天一条推送怎么做的友情链接发布网
  • ps做好的网站如何做链接网址信息查询
  • 广州百度网站推广百度推广400客服电话
  • 搜索网站模板体育热点新闻
  • 餐饮行业做微信网站有什么好处四川seo推广方案
  • 简要说明开发网站的步骤百度seo规则最新
  • 网站支付体现功能怎么做关于网站推广
  • 拖拽式建站百度官方认证
  • web网站建设调研报告关键词搜索爱站