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

    文章

    4303

    浏览量

    62411
  • BUG
    BUG
    +关注

    关注

    0

    文章

    155

    浏览量

    15649
  • 线程安全
    +关注

    关注

    0

    文章

    13

    浏览量

    2456

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

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

收藏 人收藏

    评论

    相关推荐

    江西萨瑞微荣获"2024全国第三代半导体制造最佳新锐企业"称号

    快速发展与创新实力在2024全国第三代半导体产业发展大会上,江西萨瑞微电子科技有限公司荣获"2024全国第三代半导体制造最佳新锐企业"称号。这一荣誉不仅是对公司技术创新和产业化
    的头像 发表于 10-31 08:09 230次阅读
    江西萨瑞微荣获&<b class='flag-5'>amp</b>;<b class='flag-5'>amp</b>;<b class='flag-5'>quot</b>;2024全国第三代半导体制造最佳新锐企业&<b class='flag-5'>amp</b>;<b class='flag-5'>amp</b>;<b class='flag-5'>quot</b>;称号

    OCTC发布&amp;quot;算力工厂&amp;quot;!力促智算中心高效规划建设投运

    创新提出面向未来数据中心的&quot;算力工厂&quot;模式,核心是以规(划)、建(设)、运(营)一体化的交钥匙工程,实现智算中心快速投运、绿色低碳,在当前AIGC算力供需挑战下,开创了智算中心建设运营的新思路、新方法,让客户在智算中心建设运营上更省心、更省力。
    的头像 发表于 10-11 09:10 473次阅读
    OCTC发布&<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;计划,强化生态链接共启保险AI新时代

    软通动力携子品牌软通金科受邀参加此次大会,发表&quot;智驭未来 • 探索保险AI新业态&quot;主旨演讲,并携手华为正式启动&quot;智链险界——保险生态场景链接计划&quot
    的头像 发表于 09-23 19:22 318次阅读
    软通动力携手华为启动&<b class='flag-5'>amp</b>;<b class='flag-5'>quot</b>;智链险界&<b class='flag-5'>amp</b>;<b class='flag-5'>quot</b>;计划,强化生态链接共启保险AI新时代

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

    全方位精准测量技术助力:中国经济加力发展向前&quot;进&quot;
    的头像 发表于 07-15 09:53 304次阅读
    全方位精准测量技术助力:中国经济加力发展向前&<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 471次阅读
    晶科能源荣获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 845次阅读

    2024CCLTA | &amp;quot;智&amp;quot;领检验,&amp;quot;慧&amp;quot;聚山城

    上海2024年4月2日 /美通社/ -- 2024年3月28日-31日,以"融合发展,引领未来"为主题的第十届全国检验医学技术与应用学术会议暨协同创新、融合发展国际论坛,第十届全国临床检验装备展览会(CCLTA2024)在重庆拉开帷幕。展会上,贝克曼库尔特分享了"智慧检验"、"疾病管理"、"创升中国"下的重要力作,包括全自动化学发光免疫分析DxI800、全自动生化分析仪AU5800、微生物鉴定药敏分析仪DxM1096、智研平台、DxAI智控平台LabBox Innovation等。 展会现场照片 作为体外
    的头像 发表于 04-07 18:19 1051次阅读
    2024CCLTA | &<b class='flag-5'>amp</b>;<b class='flag-5'>quot</b>;智&<b class='flag-5'>amp</b>;<b class='flag-5'>quot</b>;领检验,&<b class='flag-5'>amp</b>;<b class='flag-5'>quot</b>;慧&<b class='flag-5'>amp</b>;<b class='flag-5'>quot</b>;聚山城

    科沃斯扫地机器人通过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 825次阅读

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

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

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

    枝晶是阻碍锌基水系电池发展的一亟待解决的问题。电沉积过程主要包含离子迁移、电还原和电结晶三步骤。
    的头像 发表于 03-11 10:03 914次阅读
    电池&<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 454次阅读

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

    第二代配网行波故障预警与定位装置YT/XJ-001:守护电力线路的超能&quot;哨兵&quot; 电力,如同现代社会的血脉,支撑着我们的生活和工作正常运行。然而,一旦这条血脉出现故障,生活和工作
    的头像 发表于 01-22 15:11 512次阅读
    第二代配网行波故障预警与定位装置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 1475次阅读
    电流互感器带&<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 883次阅读