可重入代码
轉(zhuǎn)自:http://hi.baidu.com/benzus/blog/item/6bfe300aca4e9036b0351d7a.html
- 不能含有靜態(tài)(全局)非常量數(shù)據(jù)。
- 不能返回靜態(tài)(全局)非常量數(shù)據(jù)的地址。
- 只能處理由調(diào)用者提供的數(shù)據(jù)。
- 不能依賴于單實例模式資源的鎖。
- 不能調(diào)用不可重入的函數(shù)。
多'用戶/對象/進(jìn)程優(yōu)先級'以及多進(jìn)程一般會使得對可重入代碼的控制變得復(fù)雜。同時,IO代碼通常不是可重入的,因為他們依賴于像磁盤這樣共享的、單獨的資源。
可重入性是函數(shù)編程語言的關(guān)鍵特性之一。
例子
在以下的C語言代碼中,函數(shù)f和函數(shù)g都不是可重入的。
int g_var = 1;int f() {g_var = g_var + 2;return g_var; }int g() {return f() + 2; }以上代碼中,f使用了全局變量g_var,所以,如果兩個線程同時執(zhí)行它并訪問g_var,則返回的結(jié)果取決于執(zhí)行的時間。因此,f不可重入。而g調(diào)用了f,所以它也不可重入。
稍作修改后,兩個函數(shù)都是可重入的:
int f(int i) {return i + 2; }int g(int i) {return f(i) + 2; }與線程安全的關(guān)系
可重入與線程安全兩個概念都關(guān)系到函數(shù)處理資源的方式。但是,他們有一定的區(qū)別。可重入概念會影響函數(shù)的外部接口,而線程安全只關(guān)心函數(shù)的實現(xiàn)。
- 大多數(shù)情況下,要將不可重入函數(shù)改為可重入的,需要修改函數(shù)接口,使得所有的數(shù)據(jù)都通過函數(shù)的調(diào)用者提供。
- 要將非線程安全的函數(shù)改為線程安全的,則只需要修改函數(shù)的實現(xiàn)部分。一般通過加入同步機(jī)制以保護(hù)共享的資源,使之不會被幾個進(jìn)程同時訪問。
因此,相對線程安全來說,可重入性是更基本的特性,它可以保證線程安全:即,所有的可重入函數(shù)都是線程安全的,但并非所有的線程安全函數(shù)都是可重入的。
總結(jié)
- 上一篇: source命令与 .命令
- 下一篇: Linux下的进程相关编程