



下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第一篇文章帶你了解C語言函數(shù)的可重入性目錄一、不可重入函數(shù)。二、可重入函數(shù)。三、如何寫出可重入的函數(shù)四、函數(shù)的可重入性和線程安全的關(guān)系五、malloc和printf為什么不可重入總結(jié)
一、不可重入函數(shù)。
在函數(shù)中如果我們使用靜態(tài)變量了,導(dǎo)致產(chǎn)生中斷調(diào)用別的函數(shù)的過程中可能還會調(diào)用這個函數(shù),于是原來的靜態(tài)變量被在這里改變了,然后返回主體函數(shù),用著的那個靜態(tài)變量就被改變了,導(dǎo)致錯誤。這類函數(shù)我們稱為不可重入函數(shù)。
在嵌入式系統(tǒng)的設(shè)計(jì)中,經(jīng)常會出現(xiàn)多個任務(wù)調(diào)用同一個函數(shù)的情況。如果這個函數(shù)不幸被設(shè)計(jì)成為不可重入的函數(shù)的話,那么不同任務(wù)調(diào)用這個函數(shù)時可能修改其他任務(wù)調(diào)用這個函數(shù)的數(shù)據(jù),從而導(dǎo)致不可預(yù)料的后果。
不可重入函數(shù)在實(shí)時系統(tǒng)設(shè)計(jì)中被視為不安全函數(shù)。
滿足下列條件的函數(shù)多數(shù)是不可重入的:
(1)函數(shù)體內(nèi)使用了靜態(tài)的數(shù)據(jù)結(jié)構(gòu);
(2)函數(shù)體內(nèi)調(diào)用了malloc()或者free()函數(shù);
(3)函數(shù)體內(nèi)調(diào)用了標(biāo)準(zhǔn)I/O函數(shù)。
(4)函數(shù)體內(nèi)調(diào)用了不可中斷的硬件寄存器,如串口收發(fā)寄存器
二、可重入函數(shù)。
可重入函數(shù)可以被一個以上的任務(wù)調(diào)用,而不必?fù)?dān)心數(shù)據(jù)被破壞??芍厝牒瘮?shù)任何時候都可以被中斷,一段時間以后又可以運(yùn)行,而相應(yīng)的數(shù)據(jù)不會丟失。
可重入函數(shù)或者只使用局部變量,即保存在CPU寄存器中或堆棧中;或者使用全局變量,則要對全局變量予以保護(hù)。
若一個函數(shù)是可重入的,則該函數(shù)必須滿足一下必要條件:
1、不能含有靜態(tài)(全局)非常量數(shù)據(jù)。
2、不能返回靜態(tài)(全局)非常量數(shù)據(jù)的地址。
3、只能處理由調(diào)用者提供的數(shù)據(jù)。作為可重入函數(shù)的輸入?yún)?shù),只能由調(diào)用者提供,而且所提供的輸入數(shù)據(jù)必須滿足上面兩點(diǎn)要求
4、不能依賴于單實(shí)例模式資源的鎖。
5、不能調(diào)用不可重入的函數(shù)。函數(shù)內(nèi)部,盡量不能用malloc和free之類的方法進(jìn)行內(nèi)存分配和釋放,如果使用,一般情況下會造成該函數(shù)的不可重入
三、如何寫出可重入的函數(shù)
1、在寫函數(shù)時候盡量使用局部變量(例如寄存器、堆棧中的變量)。不訪問那些全局變量,不使用靜態(tài)局部變量
2、如果確實(shí)需要訪問全局變量(包括static),一定要注意實(shí)施互斥手段。可重入函數(shù)在并行運(yùn)行環(huán)境中非常重要,但是一般要為訪問全局變量付出一些性能代價。編寫可重入函數(shù)時,若使用全局變量,則應(yīng)通過關(guān)中斷、信號量(即P、V操作)等手段對其加以保護(hù)。
四、函數(shù)的可重入性和線程安全的關(guān)系
可重入與線程安全兩個概念都關(guān)系到函數(shù)處理資源的方式。但是,他們有一定的區(qū)別??芍厝敫拍顣绊懞瘮?shù)的外部接口,而線程安全只關(guān)心函數(shù)的實(shí)現(xiàn)。
大多數(shù)情況下,要將不可重入函數(shù)改為可重入的,需要修改函數(shù)接口,使得所有的數(shù)據(jù)都通過函數(shù)的調(diào)用者提供。要將非線程安全的函數(shù)改為線程安全的,則只需要修改函數(shù)的實(shí)現(xiàn)部分。一般通過加入同步機(jī)制以保護(hù)共享的資源,使之不會被幾個線程同時訪問。
線程安全與可重入性是兩個不同性質(zhì)的概念。
可重入是在單線程操作系統(tǒng)背景下,重入的函數(shù)或者子程序,按照后進(jìn)先出的線性序依次執(zhí)行完畢。多線程執(zhí)行的函數(shù)或子程序,各個線程的執(zhí)行時機(jī)是由操作系統(tǒng)調(diào)度,不可預(yù)期的,但是該函數(shù)的每個執(zhí)行線程都會不時的獲得CPU的時間片,不斷向前推進(jìn)執(zhí)行進(jìn)度。
可重入函數(shù)未必是線程安全的;線程安全函數(shù)未必是可重入的。例如,一個函數(shù)打開某個文件并讀入數(shù)據(jù)。這個函數(shù)是可重入的,因?yàn)樗亩鄠€實(shí)例同時執(zhí)行不會造成沖突;但它不是線程安全的,因?yàn)樵谒x入文件時可能有別的線程正在修改該文件,為了線程安全必須對文件加“同步鎖”。
函數(shù)在它的函數(shù)體內(nèi)部訪問共享資源使用了加鎖、解鎖操作,所以它是線程安全的,但是卻不可重入。因?yàn)槿粼摵瘮?shù)一個實(shí)例運(yùn)行到已經(jīng)執(zhí)行加鎖但未執(zhí)行解鎖時被停下來,系統(tǒng)又啟動該函數(shù)的另外一個實(shí)例,則新的實(shí)例在加鎖處將轉(zhuǎn)入等待。如果該函數(shù)是一個中斷處理服務(wù),在中斷處理時又發(fā)生新的中斷將導(dǎo)致資源死鎖。
五、malloc和printf為什么不可重入
malloc和printf通常使用全局結(jié)構(gòu),并在內(nèi)部使用基于鎖的同步。這就是為什么它們不可重入。
malloc函數(shù)可以是線程安全的,也可以是線程不安全的。兩者都不可重入:
malloc在全局堆上操作,同時發(fā)生的兩個不同的malloc調(diào)用可能返回相同的內(nèi)存塊。(第二個malloc調(diào)用應(yīng)該在獲取塊的地址之前發(fā)生,但塊沒有標(biāo)記為不可用)。這違反了malloc的后置條件,因此此實(shí)現(xiàn)不會重新進(jìn)入。
printf函數(shù)也對全局?jǐn)?shù)據(jù)進(jìn)行操作。任何輸出流通常都使用一
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 油煙機(jī)安裝合同協(xié)議書
- 茶山合作協(xié)議書
- 資金收益協(xié)議書
- 拆空調(diào)搬運(yùn)合同協(xié)議書
- 舞蹈師徒協(xié)議書
- 租金減免協(xié)議書
- 瓷磚合伙人合同協(xié)議書
- 比亞迪海豹質(zhì)保協(xié)議書
- 賠償假牙協(xié)議書
- 資源交換協(xié)議書
- 中國鐵路西安局招聘高校畢業(yè)生考試真題2024
- 2023北京初三一模數(shù)學(xué)試題匯編:代數(shù)綜合(第26題)
- 畢業(yè)設(shè)計(jì)產(chǎn)品包裝設(shè)計(jì)
- 安徽卷-2025屆高考化學(xué)全真模擬卷
- 河北省石家莊市2025屆普通高中高三教學(xué)質(zhì)量檢測(三)英語試卷及答案
- 2025屆百師聯(lián)盟高三下學(xué)期二輪復(fù)習(xí)聯(lián)考(三)政治試題(含答案)
- 2024年云南省文山州第二人民醫(yī)院選調(diào)工作人員考試真題
- 《埃菲爾鐵塔》課件
- 深圳市城市規(guī)劃標(biāo)準(zhǔn)與準(zhǔn)則2024版
- 2025年高考化學(xué)三輪沖刺:實(shí)驗(yàn)綜合大題 刷題練習(xí)題(含答案解析)
- 《低空經(jīng)濟(jì)及其產(chǎn)業(yè)發(fā)展-把握機(jī)會、布局未來》課件
評論
0/150
提交評論