基本介紹
- 中文名:可重入代碼
- 外文名:Reentry code
- 別稱:純代碼
- 定義:一種允許多個進程同時訪問的代碼
- 要求:必須保證資源的互不影響的使用
- IO代碼:通常不是可重入的
簡介,其他不同的解釋,維基百科 的解釋,與執行緒安全的關係,函式,
簡介
void test()
{
int i;
i=2;
printf("%d\n",i );
i++;
printf("%d\n",i);
}
無論誰調用它結果都一樣,得到
2
3
但
void test()
{
static int i=2;
printf("%d\n",i );
i++;
prinft("%d\n",i);
}
就不一樣了,對不同的調用結果不一樣:如:
第一次:
2
3
第二次
3
4
第三次
4
5
等等......
該明白了吧
其他不同的解釋
簡單介紹,因為驅動能夠被多個進程調用,互不干擾,這樣驅動必須是可重入的。
可重入最簡單的理解就是任何變數都是局部變數。可重入指函式在運行過程中,被中斷打斷後,待返回時仍然能夠正常運行。這就需要在編寫代碼時注意全局變數和公用資源的使用,同時還需要有編譯器的支持。否則,ucos ii就不能移植到其中了!!
維基百科 的解釋
不能含有靜態(全局)非常量數據。 不能返回靜態(全局)非常量數據的地址。 只能處理由調用者提供的數據。 不能依賴於單實例模式資源的鎖。 不能調用不可重入的函式。 多'用戶/對象/進程優先權'以及多進程一般會使得對可重入代碼的控制變得複雜。同時,IO代碼通常不是可重入的,因為他們依賴於像磁碟這樣共享的、單獨的資源。
與執行緒安全的關係
可重入與執行緒安全兩個概念都關係到函式處理資源的方式。但是,他們有一定的區別。可重入概念會影響函式的外部接口,而執行緒安全只關心函式的實現。
- 大多數情況下,要將不可重入函式改為可重入的,需要修改函式接口,使得所有的數據都通過函式的調用者提供。
- 要將非執行緒安全的函式改為執行緒安全的,則只需要修改函式的實現部分。一般通過加入同步機制以保護共享的資源,使之不會被幾個執行緒同時訪問。
執行緒安全與可重入性是兩個不同性質的概念。可重入是在單執行緒作業系統背景下,重入的函式或者子程式,按照後進先出的線性序依次執行完畢。多執行緒執行的函式或子程式,各個執行緒的執行時機是由作業系統調度,不可預期的,但是該函式的每個執行執行緒都會不時的獲得CPU的時間片,不斷向前推進執行進度。可重入函式未必是執行緒安全的;執行緒安全函式未必是可重入的。例如,一個函式打開某個檔案並讀入數據。這個函式是可重入的,因為它的多個實例同時執行不會造成衝突;但它不是執行緒安全的,因為在它讀入檔案時可能有別的執行緒正在修改該檔案,為了執行緒安全必須對檔案加“同步鎖”。另一個例子,函式在它的函式體內部訪問共享資源使用了加鎖、解鎖操作,所以它是執行緒安全的,但是卻不可重入。因為若該函式一個實例運行到已經執行加鎖但未執行解鎖時被停下來,系統又啟動該函式的另外一個實例,則新的實例在加鎖處將轉入等待。如果該函式是一個中斷處理服務,在中斷處理時又發生新的中斷將導致資源死鎖。
函式
大多數情況下,要將不可重入函式改為可重入的,需要修改函式接口,使得所有的數據都通過函式的調用者提供。 要將非執行緒安全的函式改為執行緒安全的,則只需要修改函式的實現部分。一般通過加入同步機制以保護共享的資源,使之不會被幾個進程同時訪問。 因此,相對執行緒安全來說,可重入性是更基本的特性,它可以保證執行緒安全:即,所有的可重入函式都是執行緒安全的,但並非所有的執行緒安全函式都是可重入的。
可重入性是函式程式語言的關鍵特性之一。