執行緒安全 可重入

2021-09-25 01:58:03 字數 1219 閱讀 9541

昨天有人問可重入和執行緒安全,  實際是混在一起淘漿糊了;

這2個是完全不同的概念;

可重入函式只有在signal下會發生, 比如乙個函式在執行時被中斷, 在中斷處理函式中又一次被呼叫,

這2次(每次)呼叫都能產生正確的結果,那就個可重入函式;

看乙個不可重入的例子:

void  sig_handler(int sig)

int main()

return 0;

}

gethostbyname 內部實現有乙個靜態區域性變數, 或乙個靜態全域性變數;

這意味著, 在main中gethostbyname的呼叫剛執行完或者只執行了一半, 此時signal來了, 轉到sig_handler繼續呼叫gethostbyname ,由於實現是乙個靜態變數,因此後呼叫gethostbyname將把前一次的資料覆蓋.

因此可以想象, 如果乙個函式內部使用了靜態/全域性變數來做資料處理或者返回此靜態/全域性變數,那麼一定是乙個不可重入函式;

執行緒安全:

簡單來說就是加鎖操作;

那麼執行緒安全的函式就一定是可重入的嗎 ? nonononononono ononononono !!!

例如:malloc 是執行緒安全的,他將操作乙個全域性鍊錶 , 一旦在執行過程中被sigal中斷,直接完蛋

pthread_mutex_lock 他是執行緒安全吧,  一旦執行過程中被中斷, 中斷處理中又一次pthread_mutex_lock可能直接死鎖或者破壞了內部狀態

在比如:,執行緒安全把 ? 能在中斷之後正確的執行嗎?

int func()
總之執行緒安全跟可重入是2個概念 , 雖然他們之間有些交集;

乙個函式中如果使用了靜態/全域性變數, 那他基本是乙個不可重入的函式,當然具體還是看實現;如果此函式中加了

鎖,那麼他是執行緒安全的, 如果內部也把靜態/全域性變數都刪了, 也不額外呼叫不可重入函式的話,那他就是乙個

即執行緒安全也可重入的函式了 . 

最後 , 乙個可重入的函式 是乙個執行緒安全的函式 ?   

不一定 ; 只不過一般情況可重入的函式是執行緒安全的,

原因:你自己想嘛 , 不可重入函式的特點就是  [ 使用或返回了靜態/全域性變數 或 使用了額外的不可重入函式 ]

那麼可重入函式必然不呼叫或不使用那些玩意,

最後最後, 雖然上面說一般情況可重入的函式是執行緒安全的, 還是要提一下,  這2個是不同的概念

可重入 執行緒安全

可重入 乙個函式可以同時被呼叫,不會有影響 執行緒安全 乙個函式可以被多執行緒同時呼叫,不會有影響.可重入 執行緒安全,需要比執行緒安全更強的條件.乙個函式是可重入的,一定是執行緒安全的 乙個函式是執行緒安全的,不一定是可重入的 比如 malloc不是非同步 訊號安全,但是執行緒安全的,因此其不是可...

訊號可重入執行緒安全

訊號可重入執行緒安全 2009 08 28 16 54 之所以把這幾個概念放一起,是因為它們組合在一起容易出現一些莫名其妙的錯誤,而且一旦出現,還很難被發現。更糟糕的是它們的出現需要一定的時間,並不是非常容易重現的,而且需要了解的比較多才能更好的理解它們發生的原因。這裡要用例子闡述一下。訊號的是un...

可重入與執行緒安全

之前一直糾結可重入與執行緒安全的區別,今天詳細查了一下。其實根據兩個概念的名字就可以得出結論,可重入就是重複多次結果都是一樣的,而執行緒安全則不一樣,只要不同執行緒執行的時候不會出現因不同執行緒執行順序不同而結果不同就可以。大多數情況下,要將不可重入函式改為可重入的,需要修改函式介面,使得所有的資料...