死锁问题的调试(调试技术)

本文介绍了在多线程系统中由于未正确使用加锁解锁导致的死锁问题,特别是在单片机和嵌入式系统中的影响。讨论了不可重入函数的概念,如malloc和free,并提供了一个由于malloc未成功导致死锁的代码示例。在bcos系统中,通过屏蔽中断实现临时锁,但未解锁会导致中断无法触发,进而引发系统死锁。文章强调了在使用锁时防止分支语句遗漏解锁以及中断与主循环作为并发线程的重要性。
摘要由CSDN通过智能技术生成

1. 概述

最近工作中遇到一个问题,我决定总结一下死锁的问题。在多线程的系统中经常需要利用锁来实现临界区的保护,但在临界区保护过程中经常出现加锁和解锁没有成对出现的问题。最终,系统进入死锁状态。在bcos中目前还没有实现锁的机制,即便如此任务间的调度最终也会引发临界区的问题。在bcos中解决临界区问题的方法是屏蔽中断,因为系统调度主要依靠中断来实现任务的抢占。如果在进入临界区时屏蔽系统所有中断,在退出临界区时解除中断的屏蔽可以实现类似于锁的功能。

2. 不可重入函数

在这里有必要讲解一下“不可重入函数”这个概念。“可重入函数”和“不可重入函数”的概念主要出现在操作系统和多线程系统中。可重入函数是指这个函数在执行过程中可以被打断,当系统重新调度到被打断的线程时这个函数的状态可以被恢复并继续执行并且不会改变函数执行的输出。相反,不可重入函数在执行过程中如果被打断,函数执行的状态就会丢失。当系统重新调度到该线程执行时,函数执行的输出就会出现偏差或失败。

在C语言的库函数中有非常多的不可重入函数,其中malloc和free函数就时典型的不可重入函数。对于嵌入时单片机系统,即使不带操作系统的软件系统也是一个多线程的系统。因为,一个中断处理逻辑也是一个执行线程,它随时都会打断主循环的执行。所有在单片机的系统编程的过程中一定要处理好有些不可重入函数的线程同步,否则将产生不可预知的错误和问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南波儿万

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值