0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

"可重入"和"线程安全"是两个概念 千万不要搞混了

Q4MP_gh_c472c21 来源:嵌入式ARM 作者:bug菌 2021-02-10 17:38 次阅读

大伙估计在多任务程序中使用printf打印一些信息是非常欢乐的一件事,运气不错的话偶尔错几个数据、乱几个码也不是什么大问题,倒霉点的可能就直接挂机、卡死了,那这些到底是什么原因导致的呢? 今天的这篇文章应该可以帮助你解决一大部分问题。

01

两个概念

1、可重入函数 多任务系统中每个进程或线程都是由多种执行流并发运行的,当执行流同时进入同一个函数(大部分是由于中断),而不会导致函数结果不确定或者错误,就可认为该函数是可重入的。

a2100dc0-5f65-11eb-8b86-12bb97331649.png

上图中的signal一般都是因为中断等原因产生的,在我们多任务系统中中断更是无时无刻的在随机发生着,一旦线程或者进程被中断转而去执行消息处理,而恰巧的是此时线程所执行的操作与信号处理相同,比如malloc,他们都共享同一个资源(全局堆空间)。 当信号处理返回到原来的执行流中却由于信号处理的改写而受影响,比如重入的问题导致malloc会分配相同的内存区域,或者其他的数据篡改,锁死等,这样该函数就是不可重入的。 2、线程安全 多个线程并发运行且执行相同的代码,而不会导致运行结果受影响,我们就认为是线程安全。

a2b2c6e6-5f65-11eb-8b86-12bb97331649.png

对于线程安全往往加个互斥锁就可以解决战斗,当然你如果没有使用全局变量、静态变量等等共享资源,那他们基本上是线程安全的。 其实从表面上看这两个概念并没有太大的差异,无非就是运行同一块代码,会不会导致不确定的结果。 3、VS 再仔细想想,其实这两个概念所关注的层面是不同的,可重入函数要求相同执行流执行不会受影响,而线程安全仅仅只是在线程这个层面上进行的要求。 所以可重入的要求比线程安全要更加严苛,可重入必定线程安全,而线程安全并不一定可重入,如下图是他们的关系:

a64389d0-5f65-11eb-8b86-12bb97331649.png

02

不可重入死锁

下面我们来简单分析一下不可重入死锁的问题 :

a9f66ade-5f65-11eb-8b86-12bb97331649.png

上图我们为函数加了互斥lock(不考虑递归锁),那么它就是线程安全的,然而刚把共享资源部分上锁,随机的中断信号处理发生了,转而执行信号处理函数,而在信号处理中也同样执行相同的Fuction代码,此时资源已经锁住,必须等待前面调用Fuction函数的线程释放,但此线程又在等待信号处理访问,最终死锁,凉凉! 当然你可以使用递归锁来进行处理,这在正常设计中是需要避免的,当时对于一些需要调用外部库的设计,只能选择递归锁等。

03

可重入的识别

说实在对于很多玩RTOS的伙计,直接关中断、开中断的临界资源保护就基本告别了一部分不可重入问题,而这样的操作会影响多任务的并发执行,但是如果你只是加了几把锁,可能在程序中不重入的问题还是要注意一下。 这里不可重入问题不完全总结了几点:

1、标准IO函数都会使用到全局的数据结构,比如printf函数 : 由于使用了全局标准输出stdout,所以线程不安全也就更不能重入了。

2、malloc和free : 这两个函数都是在全局的堆空间上进行操作,如果有加锁那就是线程安全的,但是不可重入。

3、对于全局、静态的资源的访问都会导致线程不安全,比如一些函数使用的是静态缓存区等,你可以使用本地copy加临界区来进行保护,尽量使用局部变量。

4、调用不可重入或者线程不安全的函数也会继承对应特点。

责任编辑:xj

原文标题:同事"可重入"与"线程安全"老分不清,导致一堆bug!

文章出处:【微信公众号:嵌入式ARM】欢迎添加关注!文章转载请注明出处。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 函数
    +关注

    关注

    3

    文章

    4232

    浏览量

    61926
  • BUG
    BUG
    +关注

    关注

    0

    文章

    155

    浏览量

    15624
  • 线程安全
    +关注

    关注

    0

    文章

    13

    浏览量

    2451

原文标题:同事"可重入"与"线程安全"老分不清,导致一堆bug!

文章出处:【微信号:gh_c472c2199c88,微信公众号:嵌入式微处理器】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    全方位精准测量技术助力:中国经济加力发展向前"进"

    全方位精准测量技术助力:中国经济加力发展向前"进"
    的头像 发表于 07-15 09:53 210次阅读
    全方位精准测量技术助力:中国经济加力发展向前&<b class='flag-5'>amp</b>;<b class='flag-5'>amp</b>;<b class='flag-5'>quot</b>;进&<b class='flag-5'>amp</b>;<b class='flag-5'>amp</b>;<b class='flag-5'>quot</b>;

    晶科能源荣获EUPD Research授予的六项&amp;quot;顶级光伏品牌&amp;quot;称号

    近日,由权威调研机构EUPD Research颁发,晶科能源在巴西、哥伦比亚、墨西哥、智利等拉美主要国家六地区荣获 &quot;顶级光伏品牌 &quot;称号。凭借先进的技术、完善的流程和对卓越的不懈追求,晶科能源将继续提升行
    的头像 发表于 05-10 09:17 336次阅读
    晶科能源荣获EUPD Research授予的六项&<b class='flag-5'>amp</b>;<b class='flag-5'>quot</b>;顶级光伏品牌&<b class='flag-5'>amp</b>;<b class='flag-5'>quot</b>;称号

    九联科技推出一款&amp;quot;射手座&amp;quot;UMA502-T7物联网模组

    在物联网技术飞速发展的时代背景下,九联科技凭借深厚的研发底蕴与创新精神,精心打造出象征着自由探索与勇敢进取精神的&quot;射手座&quot;UMA502-T7模组,以昂扬之姿挺进海外市场,宣告了九联科技物联网模组国际化进程的盛大起航。
    的头像 发表于 04-14 09:38 734次阅读

    科沃斯扫地机器人通过TÜV莱茵&amp;quot;防缠绕&amp;quot;和&amp;quot;高效边角清洁&amp;quot;认证

    3月15日,在2024中国家电及消费电子博览会(AWE)上,国际独立第三方检测、检验和认证机构德国莱茵TÜV大中华区(简称&quot;TÜV莱茵&quot;)为科沃斯款扫地机器人(型号:DDX14、DDX11)
    的头像 发表于 03-17 10:49 690次阅读

    Quanterix宣布Tau217血液检测被美国FDA授予 &amp;quot;突破性器械 &amp;quot;认证

    3月4日,Quanterix宣布其Simoa磷酸化Tau217(p-Tau 217)血液检测已被美国FDA授予 &quot;突破性器械 &quot;认证,可用于阿尔茨海默病 (AD) 的辅助诊断评估。
    的头像 发表于 03-12 17:23 1966次阅读

    电池&amp;quot;无&amp;quot;隔膜?SEI新&amp;quot;膜&amp;quot;法!

    枝晶是阻碍锌基水系电池发展的一亟待解决的问题。电沉积过程主要包含离子迁移、电还原和电结晶三步骤。
    的头像 发表于 03-11 10:03 599次阅读
    电池&<b class='flag-5'>amp</b>;<b class='flag-5'>quot</b>;无&<b class='flag-5'>amp</b>;<b class='flag-5'>quot</b>;隔膜?SEI新&<b class='flag-5'>amp</b>;<b class='flag-5'>quot</b>;膜&<b class='flag-5'>amp</b>;<b class='flag-5'>quot</b>;法!

    中创新航荣获逸动科技2023年度&amp;quot;优秀战略合作伙伴奖&amp;quot;

    近日,中创新航凭借电动船舶领域领先的技术实力、卓越的产品质量、持续稳定的交付能力以及优质高效的服务,荣获逸动科技2023年度&quot;优秀战略合作伙伴奖&quot;。
    的头像 发表于 02-29 13:51 356次阅读

    第二代配网行波故障预警与定位装置YT/XJ-001:守护电力线路的超能&amp;amp;quot;哨兵&amp;amp;quot;

    第二代配网行波故障预警与定位装置YT/XJ-001:守护电力线路的超能&quot;哨兵&quot; 电力,如同现代社会的血脉,支撑着我们的生活和工作正常运行。然而,一旦这条血脉出现故障,生活和工作
    的头像 发表于 01-22 15:11 402次阅读
    第二代配网行波故障预警与定位装置YT/XJ-001:守护电力线路的超能&<b class='flag-5'>amp</b>;<b class='flag-5'>amp</b>;<b class='flag-5'>quot</b>;哨兵&<b class='flag-5'>amp</b>;<b class='flag-5'>amp</b>;<b class='flag-5'>quot</b>;

    PSOC6使用带有2ADC通道的DMA如何设置 \&quot; 源 \&quot; 地址?

    ,然后触发中断。 然后我读取了中断函数中的两个 ADC 结果。 20kHz 时的 PWM —--&amp;gt; &amp;gt; \&quot; soc \&
    发表于 01-19 07:47

    电流互感器带&amp;quot;S&amp;quot;和不带S所表示的含义及区别

    电流互感器带&quot;S&quot;和不带S都是表示测量电流互感器精度等级。在规定使用条件下,互感器的误差在该等级规定的限值之内。电力工程中计量常用的等级有0.2、0.5、0.2S、0.5S等。
    的头像 发表于 01-14 10:32 1216次阅读
    电流互感器带&<b class='flag-5'>amp</b>;<b class='flag-5'>quot</b>;S&<b class='flag-5'>amp</b>;<b class='flag-5'>quot</b>;和不带S所表示的含义及区别

    智慧光迅荣获2023年&amp;quot;智能物联成长力企业&amp;quot;奖项

    深圳智慧光迅信息技术有限公司荣获2023年中国物联网产业大会的&quot;智能物联成长力企业&quot;奖项。
    的头像 发表于 12-09 10:21 778次阅读

    程控交流电源开机显示&amp;quot;ERR&amp;quot;的原因及解决方法分析

    程控交流电源是一种常见的电源设备,用于为各种电子设备提供稳定的交流电源。然而,有时候在开机时,程控交流电源可能会显示&quot;ERR&quot;的错误信息,使得设备无法正常工作。
    的头像 发表于 11-07 11:14 1222次阅读

    R&amp;amp;S携手Skylo Technologies增强非地面网络(NTN)测试服务

    罗德与施瓦茨(以下简称&quot;R&amp;S公司&quot;)携手Skylo Technologies打造用于Skylo非地面网络(NTN)的设备验收方案。
    的头像 发表于 10-20 09:50 576次阅读

    R&amp;amp;S针对FMCW雷达推出超短距离模拟功能

    罗德与施瓦茨(以下简称&quot;R&amp;S公司&quot;)的雷达测试系统通过模拟真实的驾驶场景,从而测试基于雷达的高级驾驶辅助系统(ADAS)和自动驾驶汽车(AD)中使用的毫米波雷达传感器。
    的头像 发表于 10-20 09:48 1053次阅读

    R&amp;amp;S推出新的W和D频段射频专用测试解决方案

    为支持毫米波和亚太赫兹前沿研究,罗德与施瓦茨(以下简称&quot;R&amp;S公司&quot;)继续推出先进的射频测试测量解决方案。
    的头像 发表于 10-11 12:31 726次阅读