c语言线程死锁 实例,c/c++开发分享一起talk C栗子吧(第一百一十七回:C语言实例–线程死锁一)...

本文详细讲解了线程死锁的概念,通过生活实例和伪代码阐述了死锁的两种常见形式:同一线程重复加锁和不同线程间互斥等待。重点介绍了如何通过合理使用互斥量和避免不当加锁来预防死锁,并强调了正确管理临界资源的重要性。
摘要由CSDN通过智能技术生成

各位看官们,大家好,上一回中咱们说的是线程同步之互斥量的例子,这一回咱们说的例子是:线程死锁。闲话休提,言归正转。让我们一起talk c栗子吧!

我们在前面章回中介绍互斥量相关的函数时提到过死锁,不过当时没有做详细的介绍,有些看官对死锁不明白。因此,我们在今天的章回中详细介绍死锁,并且使用线程来显示死锁。

死锁就是不同的程序在运行时因为某种原因发生了阻塞,进而导致程序不能正常运行。阻塞程序的原因通常都是由于程序没有正确使用临界资源。

我们举个日常生活中的例子来比喻死锁。我们把马路上行驶的

在实际的程序中造成死锁的原因有两种:

同一个线程对已经加锁的互斥量再次加锁; 线程a对互斥量一加锁,同时等待互斥量二被解锁;而此时,线程b对互斥量二加锁,同时等待互斥量一被解锁;

第一种原因相对来说容易避免,毕竟在同一个线程中,避免两次加锁操作还是容易做到的。此外,我们还可以使用尝试性加锁函数:pt

我们写一个伪代码来演示死锁:

thread_func() //线程执行函数 { lock(mutex_value); //第一次对互斥量进行加锁 //do some thing lock(mutex_value); //第二次对互斥量进行加锁,死锁发生 // do another thing unlock(mutex_value); //对互斥量进行解锁操作 unlock(mutex_value); }

第二种原因就不容易发现了,线程a锁着互斥量一不放,同时等待互斥量二被解锁;而线程b锁着互斥量二不放,同时等待互斥量一被解锁。它们都在等待互斥量被解锁,但是却不肯对被自己加锁的互斥量进行解锁操作,因此就发生了死锁。这种死锁是在两个线程中操作不同的互斥量造成的,因此不容易被发现。这就需要我们不断地积累经验来避免死锁发生。

我们写一个伪代码来演示死锁:

thread_funca() //线程a的执行函数 { lock(mutex_value1); //对互斥量一进行加锁 //do some thing lock(mutex_value2); //对互斥量二进行加锁,等待互斥量二被解锁 // do another thing unlock(mutex_value2); //对互斥量二进行解锁操作 unlock(mutex_value1); //对互斥量一进行解锁操作 } thread_funcb() //线程b的执行函数 { lock(mutex_value2); //对互斥量二进行加锁 //do some thing lock(mutex_value1); //对互斥量一进行加锁,等待互斥量一被解锁 // do another thing unlock(mutex_value1); //对互斥量一进行解锁操作 unlock(mutex_value2); //对互斥量二进行解锁操作 }

程序发生死锁后就会一直阻塞,直到消耗完资源为止。因此,我们一定要正确使用互斥量以及线程,不然会在程序中造成严重的错误。

各位看官,关于死锁的例子咱们就说到这里。欲知后面还有什么例子,且听下回分解 。

本文来自网络收集,不代表猴子技术宅立场,如涉及侵权请点击右边联系管理员删除。

如若转载,请注明出处:https://www.ssfiction.com/c-cyuyankaifa/606866.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值