可重入程式與不可重入程式的區分

2022-01-31 15:02:16 字數 746 閱讀 7701

一旦涉及到排程,就需要對任務之間進行同步和互斥了,比如常見的觸發排程的技術如中斷、任務睡眠、核心搶占等。

我在這裡舉的例子是可重入型函式,這也是可重入性的基礎,其它引申出來的概念或者應用都是建立在它上面的。可重入型函式任何時候都可以被中斷,一段時間以後又可以執行,而相應資料不會丟失。可重入型函式只使用區域性變數,即變數儲存在cpu暫存器中或棧中。

1

void strcpy(char *dest, char *src) 2

6 *dest =nul;

7 }

strcpy()是屬於可重入型函式,多個任務或者執行緒呼叫它之後,並不會帶來同步等問題。

如果說某個函式使用的變數涉及到全域性變數或者堆,這樣的函式就可能是不可重入型函式了,有可能得解決資源互斥的問題。在嵌入式研發中,可以利用開關中斷、 任務優先順序調整,訊號量,自旋鎖等多種手段來解決不可重入的問題。舉個常見的例子,使用全域性變數的函式也並非一定是不可重入的,例如該全域性變數已經被賦值 且唯讀性質。

再舉乙個實際例子,某個函式的內部並不是所有**都是不可重入的,如果有相當部分**並不涉及資源互斥,這時候就可以採用加鎖解鎖的方式來進行任務之間同 步,達到邏輯意義上的可重入。當然,程式的邏輯還得設計人員自己控制,否則容易出現多個任務呼叫同一段**,誰也無法獲得執行權,造成死鎖的情況。

總結:可重入性是多工、多執行緒開發的乙個重要概念,特別在設計之初要予以考慮。另外對於很多系統呼叫或者說第三方函式庫,對於模組是否可重入應該小心求證。   

可重入與不可重入

這種情況出現在多工系統當中,在任務執行期間捕捉到訊號並對其進行處理時,程序正在執行的指令序列就被訊號處理程式臨時中斷。如果從訊號處理程式返回,則繼續執行程序斷點處的正常指令序列,從重新恢復到斷點重新執行的過程中,函式所依賴的環境沒有發生改變,就說這個函式是可重入的,反之就是不可重入的。眾所周知,在程...

可重入 不可重入

在任務執行期間捕捉到訊號並對其進行處理時,程序正在執行的指令序列就被訊號處理程式臨時中斷。如果從訊號處理程式返回,則繼續執行程序斷點處的正常指令序列,從重新恢復到斷點重新執行的過程中,函式所依賴的環境沒有發生改變,就說這個函式是可重入的,反之就是不可重入的。眾所周知,在程序中斷期間,系統會儲存和恢復...

可重入和不可重入

重入一般可以理解為乙個函式在同時多次呼叫,例如作業系統在程序排程過程中,或者微控制器 處理器等的中斷的時候會發生重入的現象。一般浮點運算都是由專門的硬體來完成,舉個例子假設有個硬體暫存器名字叫做float,用來計算和存放浮點數的中間運算結果 假設有這麼個函式 void fun 假如第一次執行,有個對...