大伙估計在多任務程序中使用printf打印一些信息是非常歡樂的一件事,運氣不錯的話偶爾錯幾個數(shù)據(jù)、亂幾個碼也不是什么大問題,倒霉點的可能就直接掛機、卡死了,那這些到底是什么原因導致的呢? 今天的這篇文章應該可以幫助你解決一大部分問題。
01
兩個概念
1、可重入函數(shù) 多任務系統(tǒng)中每個進程或線程都是由多種執(zhí)行流并發(fā)運行的,當執(zhí)行流同時進入同一個函數(shù)(大部分是由于中斷),而不會導致函數(shù)結果不確定或者錯誤,就可認為該函數(shù)是可重入的。
上圖中的signal一般都是因為中斷等原因產生的,在我們多任務系統(tǒng)中中斷更是無時無刻的在隨機發(fā)生著,一旦線程或者進程被中斷轉而去執(zhí)行消息處理,而恰巧的是此時線程所執(zhí)行的操作與信號處理相同,比如malloc,他們都共享同一個資源(全局堆空間)。 當信號處理返回到原來的執(zhí)行流中卻由于信號處理的改寫而受影響,比如重入的問題導致malloc會分配相同的內存區(qū)域,或者其他的數(shù)據(jù)篡改,鎖死等,這樣該函數(shù)就是不可重入的。 2、線程安全 多個線程并發(fā)運行且執(zhí)行相同的代碼,而不會導致運行結果受影響,我們就認為是線程安全。
對于線程安全往往加個互斥鎖就可以解決戰(zhàn)斗,當然你如果沒有使用全局變量、靜態(tài)變量等等共享資源,那他們基本上是線程安全的。 其實從表面上看這兩個概念并沒有太大的差異,無非就是運行同一塊代碼,會不會導致不確定的結果。 3、VS 再仔細想想,其實這兩個概念所關注的層面是不同的,可重入函數(shù)要求相同執(zhí)行流執(zhí)行不會受影響,而線程安全僅僅只是在線程這個層面上進行的要求。 所以可重入的要求比線程安全要更加嚴苛,可重入必定線程安全,而線程安全并不一定可重入,如下圖是他們的關系:
02
不可重入死鎖
下面我們來簡單分析一下不可重入死鎖的問題 :
上圖我們?yōu)楹瘮?shù)加了互斥lock(不考慮遞歸鎖),那么它就是線程安全的,然而剛把共享資源部分上鎖,隨機的中斷信號處理發(fā)生了,轉而執(zhí)行信號處理函數(shù),而在信號處理中也同樣執(zhí)行相同的Fuction代碼,此時資源已經鎖住,必須等待前面調用Fuction函數(shù)的線程釋放,但此線程又在等待信號處理訪問,最終死鎖,涼涼! 當然你可以使用遞歸鎖來進行處理,這在正常設計中是需要避免的,當時對于一些需要調用外部庫的設計,只能選擇遞歸鎖等。
03
可重入的識別
說實在對于很多玩RTOS的伙計,直接關中斷、開中斷的臨界資源保護就基本告別了一部分不可重入問題,而這樣的操作會影響多任務的并發(fā)執(zhí)行,但是如果你只是加了幾把鎖,可能在程序中不重入的問題還是要注意一下。 這里不可重入問題不完全總結了幾點:
1、標準IO函數(shù)都會使用到全局的數(shù)據(jù)結構,比如printf函數(shù) : 由于使用了全局標準輸出stdout,所以線程不安全也就更不能重入了。
2、malloc和free : 這兩個函數(shù)都是在全局的堆空間上進行操作,如果有加鎖那就是線程安全的,但是不可重入。
3、對于全局、靜態(tài)的資源的訪問都會導致線程不安全,比如一些函數(shù)使用的是靜態(tài)緩存區(qū)等,你可以使用本地copy加臨界區(qū)來進行保護,盡量使用局部變量。
4、調用不可重入或者線程不安全的函數(shù)也會繼承對應特點。
責任編輯:xj
原文標題:同事"可重入"與"線程安全"老分不清,導致一堆bug!
文章出處:【微信公眾號:嵌入式ARM】歡迎添加關注!文章轉載請注明出處。
-
函數(shù)
+關注
關注
3文章
4367瀏覽量
64145 -
BUG
+關注
關注
0文章
156瀏覽量
15952 -
線程安全
+關注
關注
0文章
13瀏覽量
2515
原文標題:同事"可重入"與"線程安全"老分不清,導致一堆bug!
文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
企業(yè)動態(tài)丨美能光伏榮膺江蘇省2025年度"專精特新"企業(yè)稱號

倉儲界的&quot;速效救心丸&quot;,Ethercat轉PROFINET網關實戰(zhàn)案例

中美貿易硬核破局!先積集成以中國&amp;quot;芯&amp;quot;智造筑牢供應鏈護城河

電纜局部放電在線監(jiān)測:守護電網安全的&amp;quot;黑科技&amp;quot;

煉油廠開閉所局放監(jiān)測:為能源樞紐裝上&amp;quot;智能安全閥&amp;quot;

隧道管廊變壓器局放在線監(jiān)測:為地下&amp;quot;電力心臟&amp;quot;裝上智能聽診器

鐳神智能MS10超遠距光纖激光雷達:低空安全的&amp;quot;千里眼&amp;quot;,打造無人機管控新標桿

新品情報局 | 自來水廠都在搶的&amp;quot;水質CT機&amp;quot;——凱米斯FUV-408如何用一道光省下百萬運維費?

【硬核測評】凌華DAQE雙雄爭霸:工業(yè)數(shù)據(jù)采集界的&amp;quot;速度與激情&amp;quot;實戰(zhàn)解析

傳統(tǒng)產線VS智能工控:華頡科技如何用模塊化設計撕掉&amp;quot;電老虎&amp;quot;標簽?

力合微電子攜手中山古鎮(zhèn)政府開啟&amp;quot;智光互聯(lián)&amp;quot;新紀元 共筑全球智能照明產業(yè)高地

3分鐘讀懂 | 氣密性檢測儀如何&amp;quot;揪出&amp;quot;泄漏點?原理全拆解!

創(chuàng)新驅動未來:大為錫膏為高精尖散熱器技術注入&amp;quot;強芯&amp;quot;動力

軟通動力攜手華為啟動&quot;智鏈險界&quot;計劃,強化生態(tài)鏈接共啟保險AI新時代

評論