可重入和執行緒安全

2021-08-20 07:24:31 字數 1603 閱讀 2354

綜觀整個文件,術語可重入和執行緒安全總是被用來標記類和函式,表明他們如何被用在多執行緒程式中。

乙個執行緒安全的函式能被多個執行緒同時呼叫,甚至在這些呼叫使用共享資料時,因為所有對共享資料的引用是序列進行的。

乙個可重入的函式也能被多個執行緒同時呼叫,但前提是每個呼叫只使用它們自己的資料。

所以,乙個執行緒安全的函式總是可重入的, 但乙個可重入的函式不總是執行緒安全的。

引申開來,如果乙個類的成員函式能被多個執行緒安全地呼叫,那麼這個類就被稱為可重入, 只要每個執行緒各使用這個類的乙個不同例項即可。

如果這個類的成員函式能被多個執行緒安全地呼叫,那麼這個類就是執行緒安全的,即使所有執行緒都使用同乙個類例項。

注意:如果qt的類們企圖被用在多執行緒環境中,那麼他們只是被記錄為執行緒安全地。如果乙個函式沒有被標記為執行緒安全或可重入,那麼它也不應該被用在不同執行緒中。如果乙個類沒有被標記為執行緒安全或可重入,那麼這種類的乙個特定例項也不應該被不同的執行緒訪問。

c++類通常都是可重入的,僅僅是因為他們脂肪紋他們自己的成員資料。任意執行緒都能呼叫乙個可重入類例項上的乙個成員函式,只要在同一時刻,不會有其他執行緒能呼叫同一例項上的乙個成員函式。例如,下面的counter類就是可重入的。

class counter

void increment()

void decrement()

intvalue() const

private:

int n;

};

這個counter類不是執行緒安全的,因為如果多個執行緒嘗試修改資料成員 n , 結果是未定義的。這是因為++ 和– 操作不總是原子性的。實際上,

他們通常被擴充套件為第三方機器指令:

載入變數的值到乙個暫存器。

增加或減少暫存器的值。

將暫存器的值存回主記憶體。

如果執行緒a和執行緒b同時載入了變數的舊值,增加了他們得暫存器,並且存回記憶體,最終他們會相互重寫,並且那個變數將只會被增加一次!

class counter

void increment()

void decrement()

intvalue() const

private:

mutable qmutex mutex;

int n;

};

qmutex類在它的建構函式中自動鎖定mutex物件 ,並且在它的析構函式結尾解鎖mutex物件。鎖定mutex可以保證來自不同執行緒的訪問將被序列

執行。mutex資料成員用mutable限定詞宣告,因為我們需要鎖定和解鎖mutex物件,用 value()函式,這個函式是乙個const函式。

很多qt類是可重入的,但他們並不是執行緒安全的,因為讓他們執行緒安全會引發額外的開銷,即反覆鎖定和解鎖乙個qmutex物件的開銷。例如,

qstring是可重入但不是執行緒安全的。你能安全地訪問qstring的不同例項,同時從多個執行緒,但是你不能安全地訪問同乙個qstring例項,同時

從多個執行緒(除非你自己用乙個qmutex來保護訪問操作)。

注意:多執行緒領域的術語還沒有完全標準化。posix使用可重入和執行緒安全這種定義,和它的c api有幾分不同。當在qt中使用其他物件導向c++類庫時,需要確認定義是被理解的。

可重入和執行緒安全

執行緒安全這個詞對我來說已經不是很陌生的了,但是遇到乙個叫做可重入函式的詞,它給我的感覺和執行緒安全是這麼的相近,但既然拿出來了,肯定是有區別的,下面就說說他們之間的區別和聯絡。要先解釋這兩個詞語才行。執行緒安全 似乎是在牛客網刷題的時候看到乙個正確的選項說的是,執行緒安全問題都是由全域性變數及靜態...

可重入和執行緒安全

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

可重入 執行緒安全

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