APUE 可重入函式 和不可重入

2021-10-11 03:21:58 字數 1109 閱讀 2444

可重入函式(reentrant):在任意時刻可以被中斷,稍後再繼續執行,不會丟失資料,即不用擔心資料被其他執行緒篡改。可重入函式必須滿足以下三個條件:

可以在執行的過程中可以被打斷;

被打斷之後,在該函式一次呼叫執行完之前,可以再次被呼叫(或進入,reentered)。

再次呼叫執行完之後,被打斷的上次呼叫可以繼續恢復執行,並正確執行。

多工呼叫某一不可重入函式時,可能修改其他任務呼叫該函式的資料,從而導致不可預料的後果。

即不可重入函式不能由超過乙個任務所共享,除非能確保函式的互斥(或者使用訊號量,或者在**的關鍵部分禁用中斷)。

滿足下面條件之一的都數是不可重入函式:

使用了靜態資料結構或者全域性變數;

呼叫了malloc或free;

呼叫了標準i/o函式;標準io庫很多實現都以不可重入的方式使用全域性資料結構。

進行了浮點運算.許多的處理器/編譯器中,浮點一般都是不可重入的 (浮點運算大多使用協處理器或者軟體模擬來實現。

呼叫printf。( 注:printf引用全域性stdout; malloc, free會引用全域性的記憶體分配表。)

不要使用全域性變數和static變數。因為別的**很可能改變這些變數值。

在寫函式時候盡量使用區域性變數(例如暫存器、堆疊中的變數);

對於要使用的全域性變數要加以保護(如採取關中斷、訊號量等互斥方法),這樣構成的函式就一定是乙個可重入的函式。

不能呼叫其它任何不可重入的函式。,printf都是不可重入的.

---->存疑:訊號的處理函式要求是可重入的?—.我確實可以在裡面寫個printf啊

謹慎使用堆疊。

在和硬體發生互動的時候,切記執行類似 disinterrupt() 之類的操作,就是關閉硬體中斷。完成互動記得開啟中斷,在有些系列上,這叫做「進入/ 退出核心」。

可重入函式與執行緒安全沒有必然聯絡。

即,乙個可重入函式不一定是執行緒安全的,乙個執行緒安全的函式不一定是可重入的。比如printf,是執行緒安全的,但是卻不可重入。

但,不可重入函式一定不是執行緒安全的。

可重入和不可重入函式

把乙個不可重入函式變成可重入的唯一方法是用可重入規則來重寫它。其實很簡單,只要遵守了幾條很容易理解的規則,那麼寫出來的函式就是可重入的。1 不要使用全域性變數。因為別的 很可能覆蓋這些變數值。2 在和硬體發生互動的時候,切記執行類似disinterrupt 之類的操作,就是關閉硬體中斷。完成互動記得...

可重入函式和不可重入函式

可重入函式 可重入函式主要用於多工環境中,乙個可重入函式簡單來說是可以被中斷的函式,即可以在函式執行的任何時刻中斷它,轉入os排程下去執行另一段 而返回控制時不出現錯誤,這意味著它除了使用自己棧上的變數以外,不依賴於任何環境 包括static 這樣的函式就是purecode 純 可重入,它可以允許該...

可重入函式和不可重入函式

作為乙個程式設計人員,一定要有可重入和不可重入概念,但工作中發現的現象讓我大跌眼鏡 很多人沒聽說過!亡羊補牢,為時不晚,現在在腦子中種下這顆概念種子也不遲。為什麼說一定要有可重入和不可重入的概念呢,因為我們的程式肯定不只在main 函式中簡單的跑乙個while 1 迴圈,一般都會涉及到中斷和作業系統...