最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一篇文章帶你了解C語言函數(shù)的可重入性

 更新時間:2021年08月25日 11:47:14   作者:zhuimeng_ruili  
這篇文章主要為大家詳細介紹了C語言函數(shù)的可重入性,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

一、不可重入函數(shù)。

在函數(shù)中如果我們使用靜態(tài)變量了,導致產(chǎn)生中斷調(diào)用別的函數(shù)的 過程中可能還會調(diào)用這個函數(shù),于是原來的 靜態(tài)變量被在這里改變了,然后返回主體函數(shù),用著的那個靜態(tài)變量就被改變了,導致錯誤。這類函數(shù)我們稱為不可重入函數(shù)。

在 嵌入式系統(tǒng)的設計中,經(jīng)常會出現(xiàn)多個任務調(diào)用同一個函數(shù)的情況。如果這個函數(shù)不幸被設計成為不可重入的函數(shù)的話,那么不同任務調(diào)用這個函數(shù)時可能修改其他任 務調(diào)用這個函數(shù)的數(shù)據(jù),從而導致不可預料的后果。

不可重入函數(shù)在實時系統(tǒng)設計中被視為不安全函數(shù)。

 滿足下列條件的函數(shù)多數(shù)是不可重入的:

(1)函數(shù)體內(nèi)使用了靜態(tài)的數(shù)據(jù)結構;

(2)函數(shù)體內(nèi)調(diào)用了malloc()或者free()函數(shù);

(3)函數(shù)體內(nèi)調(diào)用了標準I/O函數(shù)。

(4)函數(shù)體內(nèi)調(diào)用了不可中斷的硬件寄存器,如串口收發(fā)寄存器

二、可重入函數(shù)。

可重入函數(shù)可以被一個以上的任務調(diào)用,而不必擔心數(shù)據(jù)被破壞。可重入函數(shù)任何時候都可以被中斷,一段時間以后又可以運行,而相應的數(shù)據(jù)不會丟失。

可重入函數(shù)或者只使用局部變量,即保存在CPU寄存器中或堆棧中;或者使用全局變量,則要對全局變量予以保護。

若一個函數(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ù)必須滿足上面兩點要求

4、不能依賴于單實例模式資源的鎖。

5、不能調(diào)用不可重入的函數(shù)。 函數(shù)內(nèi)部,盡量不能用 malloc 和 free 之類的方法進行內(nèi)存分配和釋放,如果使用,一般情況下會造成該函數(shù)的不可重入

三、如何寫出可重入的函數(shù)

1、在寫函數(shù)時候盡量使用局部變量(例如寄存器、堆棧中的變量)。不訪問那些全局變量,不使用靜態(tài)局部變量

2、如果確實需要訪問全局變量(包括static),一定要注意實施互斥手段??芍厝牒瘮?shù)在并行運行環(huán)境中非常重要,但是一般要為訪問全局變量付出一些性能代價。編寫可重入函數(shù)時,若使用全局變量,則應通過關中斷、信號量(即P、V操作)等手段對其加以保護。

四、函數(shù)的可重入性和線程安全的關系

可重入與線程安全兩個概念都關系到函數(shù)處理資源的方式。但是,他們有一定的區(qū)別??芍厝敫拍顣绊懞瘮?shù)的外部接口,而線程安全只關心函數(shù)的實現(xiàn)。

大多數(shù)情況下,要將不可重入函數(shù)改為可重入的,需要修改函數(shù)接口,使得所有的數(shù)據(jù)都通過函數(shù)的調(diào)用者提供。要將非線程安全的函數(shù)改為線程安全的,則只需要修改函數(shù)的實現(xiàn)部分。一般通過加入同步機制以保護共享的資源,使之不會被幾個線程同時訪問。

線程安全與可重入性是兩個不同性質(zhì)的概念。

可重入是在單線程操作系統(tǒng)背景下,重入的函數(shù)或者子程序,按照后進先出的線性序依次執(zhí)行完畢。多線程執(zhí)行的函數(shù)或子程序,各個線程的執(zhí)行時機是由操作系統(tǒng)調(diào)度,不可預期的,但是該函數(shù)的每個執(zhí)行線程都會不時的獲得CPU的時間片,不斷向前推進執(zhí)行進度。

可重入函數(shù)未必是線程安全的;線程安全函數(shù)未必是可重入的。例如,一個函數(shù)打開某個文件并讀入數(shù)據(jù)。這個函數(shù)是可重入的,因為它的多個實例同時執(zhí)行不會造成沖突;但它不是線程安全的,因為在它讀入文件時可能有別的線程正在修改該文件,為了線程安全必須對文件加“同步鎖”。

函數(shù)在它的函數(shù)體內(nèi)部訪問共享資源使用了加鎖、解鎖操作,所以它是線程安全的,但是卻不可重入。因為若該函數(shù)一個實例運行到已經(jīng)執(zhí)行加鎖但未執(zhí)行解鎖時被停下來,系統(tǒng)又啟動該函數(shù)的另外一個實例,則新的實例在加鎖處將轉入等待。如果該函數(shù)是一個中斷處理服務,在中斷處理時又發(fā)生新的中斷將導致資源死鎖。

五、malloc和printf為什么不可重入

malloc和printf通常使用全局結構,并在內(nèi)部使用基于鎖的同步。這就是為什么它們不可重入。

malloc函數(shù)可以是線程安全的,也可以是線程不安全的。兩者都不可重入:

malloc在全局堆上操作,同時發(fā)生的兩個不同的malloc調(diào)用可能返回相同的內(nèi)存塊。(第二個malloc調(diào)用應該在獲取塊的地址之前發(fā)生,但塊沒有標記為不可用)。這違反了malloc的后置條件,因此此實現(xiàn)不會重新進入。

printf函數(shù)也對全局數(shù)據(jù)進行操作。任何輸出流通常都使用一個附加到資源數(shù)據(jù)的全局緩沖區(qū)(用于終端或文件的緩沖區(qū))。打印過程通常是將數(shù)據(jù)復制到緩沖區(qū),然后刷新緩沖區(qū)的序列。

總結

本篇文章就到這里了,希望能給你帶來幫助,也希望您能夠多多關注腳本之家的更多內(nèi)容!

相關文章

  • C語言如何把浮點數(shù)轉換為字符串

    C語言如何把浮點數(shù)轉換為字符串

    這篇文章主要介紹了C語言如何把浮點數(shù)轉換為字符串方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • C++線程中幾類鎖的詳解

    C++線程中幾類鎖的詳解

    這篇文章主要為大家介紹了C++線程中幾類鎖,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-11-11
  • C++連接mysql數(shù)據(jù)庫的兩種方法小結

    C++連接mysql數(shù)據(jù)庫的兩種方法小結

    這篇文章主要介紹了C++連接mysql數(shù)據(jù)庫的兩種方法小結,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-04-04
  • C++實現(xiàn)支持泛型的LFU詳解

    C++實現(xiàn)支持泛型的LFU詳解

    這篇文章主要給大家介紹了關于C++實現(xiàn)LFU的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Redis具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2021-09-09
  • C語言實踐設計開發(fā)飛機游戲

    C語言實踐設計開發(fā)飛機游戲

    飛機大戰(zhàn)想必是很多人童年時期的經(jīng)典游戲,我們依舊能記得抱個老人機娛樂的場景,下面這篇文章主要給大家介紹了關于如何利用C語言寫一個簡單的飛機大戰(zhàn)小游戲的相關資料,需要的朋友可以參考下
    2022-02-02
  • C語言、C++內(nèi)存對齊問題詳解

    C語言、C++內(nèi)存對齊問題詳解

    這篇文章主要介紹了C語言、C++內(nèi)存對齊問題詳解,內(nèi)存對齊的問題主要存在于理解struct和union等復合結構在內(nèi)存中的分布,需要的朋友可以參考下
    2014-10-10
  • 用C語言實現(xiàn)單鏈表的各種操作(二)

    用C語言實現(xiàn)單鏈表的各種操作(二)

    本篇文章是對用C語言實現(xiàn)單鏈表的各種操作進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • 使用C語言實例描述程序中的內(nèi)聚和耦合問題

    使用C語言實例描述程序中的內(nèi)聚和耦合問題

    這篇文章主要介紹了用C語言實例描述程序中的內(nèi)聚和耦合,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-08-08
  • C++?右值引用與?const?關鍵字詳解

    C++?右值引用與?const?關鍵字詳解

    C++中的const關鍵字的用法非常靈活,而使用const將大大改善程序的健壯性,const關鍵字是一種修飾符,這篇文章主要介紹了C++?右值引用與?const?關鍵字,需要的朋友可以參考下
    2022-10-10
  • C語言詳解格式控制符scanf與printf的輸入輸出

    C語言詳解格式控制符scanf與printf的輸入輸出

    這篇文章主要介紹了C語言格式控制符中輸入scanf()和輸出printf()的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2022-04-04

最新評論

株洲市| 滁州市| 余江县| 华宁县| 全南县| 历史| 交城县| 靖安县| 凌云县| 珠海市| 正阳县| 新巴尔虎左旗| 海伦市| 菏泽市| 北辰区| 洛浦县| 皮山县| 图木舒克市| 莱州市| 柯坪县| 宜阳县| 徐汇区| 沙湾县| 芜湖市| 平陆县| 嘉荫县| 博罗县| 临猗县| 哈巴河县| 四平市| 修水县| 奈曼旗| 阳泉市| 松原市| 和平区| 秭归县| 新巴尔虎右旗| 二手房| 南华县| 安庆市| 博罗县|