可重入和執行緒安全

2021-08-15 10:51:09 字數 1719 閱讀 9796

執行緒安全這個詞對我來說已經不是很陌生的了,但是遇到乙個叫做可重入函式的詞,它給我的感覺和執行緒安全是這麼的相近,但既然拿出來了,肯定是有區別的,下面就說說他們之間的區別和聯絡。

要先解釋這兩個詞語才行。

執行緒安全:似乎是在牛客網刷題的時候看到乙個正確的選項說的是,執行緒安全問題都是由全域性變數及靜態變數引起的。

可重入函式:按我現在的理解就是,因為不同的執行流執行同乙個函式,導致函式的執行順序和預期的函式執行順序不同導致執行邏輯不正確,得不到正確的結果

這麼一看,可重入函式和執行緒安全似乎沒有什麼大的關係,下面給出兩個比較典型的例子,來看一下。

執行緒安全:先說一下環境,如下面的**表示的一樣,a和b都是靜態變數(也就是說是全域性可見的),兩段**都在同乙個專案中

1

static

inta;

2static

intb;

3 a=10

;//!!!!!!!!

4 b=a;

a=5

;//!!!!!!

a=b;

看著兩段**似乎沒什麼關係,各自執行各自的,但是當有兩個執行緒(都屬於同乙個程序)同時跑這個程式的時候,問題就出現了,也就是執行緒a和執行緒b的執行順序:

執行緒a:a=10;

執行緒b:a=5;

執行緒a:b=a;

執行緒b:a=b;

本來b是要等於10的,但由於執行緒b先執行了a=5導致b最終結果程式設計5出現了錯誤。這就是乙個簡單的執行緒安全的例子。

可重入函式:常見的情況是,程式執行到某個函式foo()時,收到訊號,於是暫停目前正在執行的函式,轉到訊號處理 函式,而這個訊號處理函式的執行過程中,又恰恰也會進入到剛剛執行的函式foo(),這樣便發生了所謂的重入,那麼這麼做的結果會變成什麼樣子呢?

當執行完第一次insert的時候,假設此時發生了中斷,導致系統陷入核心,當系統準備從核心態切換到使用者態的時候檢查到此時有訊號待處理,於是呼叫訊號處理函式(就是註冊好的signalhandler啦),但是恰好註冊的函式中有一次對insert進行了呼叫,這就相當於有兩個人同時進入了乙個小黑屋裡一樣,有多個執行流在對該函式進行操作,最終導致記憶體洩漏,丟失了對node2的控制。

這樣看來,執行緒安全和可重入的問題都是因為執行流的問題引起的了。

很顯然,如果乙個函式是可重入函式,那麼它一定是執行緒安全的,但是如果乙個函式是執行緒安全的,它不一定是可重入函式,就跟上圖中舉得例子一樣的,很明顯insert函式是執行緒安全的,但是它並不是可重入函式

那麼究竟什麼是可重入函式的定義呢?

在多執行緒或有異常控制流的情況下,當某個函式執行到中途時,控制流(也就是當前指令序列)就有可能被打斷而去執行另乙個函式.而"另乙個函式"很有可能是它本身.,如果在這種情況下不會出現問題,比如說資料或狀態不會被破壞,行為確定。那麼這個函式就被稱做"可重入"的.

可重入函式需要滿足什麼條件呢?

可重入和執行緒安全

綜觀整個文件,術語可重入和執行緒安全總是被用來標記類和函式,表明他們如何被用在多執行緒程式中。乙個執行緒安全的函式能被多個執行緒同時呼叫,甚至在這些呼叫使用共享資料時,因為所有對共享資料的引用是序列進行的。乙個可重入的函式也能被多個執行緒同時呼叫,但前提是每個呼叫只使用它們自己的資料。所以,乙個執行...

可重入和執行緒安全

1 定義 1 執行緒安全 多個執行緒同時執行一段 不會造成資源的衝突,不會產生錯誤的結果,那麼這段 是執行緒安全的。2 可重入 多個執行流反覆執行一段 其結果不會發生改變。2 條件 1 常見執行緒安全滿足的條件 2 常見可重入函式滿足的條件 3 區別 可重入的函式必定是執行緒安全的,而執行緒安全的函...

可重入 執行緒安全

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