術語「可重入」和「執行緒安全」用以指示函式如何在多執行緒應用程式中使用:
因此,執行緒安全函式始終是可重入的,但可重入函式並非始終是執行緒安全的。
擴充套件一下,如果可以從多個執行緒安全地呼叫類的成員函式,則該類稱為可重入的,只要每個執行緒使用該類的不同例項即可。如果可以從多個執行緒安全地呼叫其成員函式,則該類是執行緒安全的,即使所有執行緒都使用該類的相同例項也是如此。
注意:如果打算將qt類用於多個執行緒,則僅將它們記錄為執行緒安全的。如果某個函式未標記為執行緒安全或可重入,則不應在其他執行緒中使用該函式。如果某個類未標記為執行緒安全或可重入,則不應從其他執行緒訪問該類的特定例項。
c++類通常是可重入的,僅因為它們僅訪問自己的成員資料。只要沒有其他執行緒可以同時在該類的同一例項上呼叫成員函式,則任何執行緒都可以在可重入類的例項上呼叫成員函式。例如,下面的counter類是可重入的:
class counter
void increment()
void decrement()
int value() const
private:
int n;
};
該類不是執行緒安全的,因為如果多個執行緒嘗試修改資料成員n,則結果是不確定的。 這是因為++和--運算子並不總是原子的。 實際上,它們通常擴充套件為三個機器指令:
1.將變數的值載入到暫存器中。
2.遞增或遞減暫存器的值。
3.將暫存器的值儲存回主儲存器。
如果執行緒a和執行緒b同時載入變數的舊值,增加其暫存器並儲存回去,它們最終將相互覆蓋,並且變數僅增加一次!
顯然,訪問必須被序列化:執行緒a必須執行第1、2、3步(在原子上不中斷),執行緒b才能執行相同的步驟; 或相反亦然。 使類具有執行緒安全性的一種簡單方法是使用qmutex保護對資料成員的所有訪問:
class counter
void increment()
void decrement()
int value() const
private:
mutable qmutex mutex;
int n;
};
qmutexlocker類在函式的末尾自動將互斥鎖鎖定在其建構函式中,並在呼叫析構函式時將其解鎖。鎖定互斥鎖可確保對來自不同執行緒的訪問進行序列化。互斥鎖資料成員用可變限定符宣告,因為我們需要在value()中鎖定和解鎖互斥鎖,這是乙個const函式。
注意:多執行緒域中的術語尚未完全標準化。 posix使用可重入和執行緒安全的定義,這些定義對其c api有所不同。當將其他物件導向的c++類庫與qt一起使用時,請確保了解定義。
Qt之可重入與執行緒安全
本篇文章中,術語 可重入性 和 執行緒安全 被用來標記類與函式,以表明它們如何被應用在多執行緒應用程式中。因此,乙個執行緒安全的函式總是可重入的,但乙個可重入的函式並不一定是執行緒安全的。擴充套件開來,乙個可重入的類,指的是它的成員函式可以被多個執行緒安全地呼叫,只要每個執行緒使用這個類的不同的物件...
Qt之可重入與執行緒安全
本篇文章中,術語 可重入性 和 執行緒安全 被用來標記類與函式,以表明它們如何被應用在多執行緒應用程式中。因此,乙個執行緒安全的函式總是可重入的,但乙個可重入的函式並不一定是執行緒安全的。擴充套件開來,乙個可重入的類,指的是它的成員函式可以被多個執行緒安全地呼叫,只要每個執行緒使用這個類的不同的物件...
執行緒安全與可重入函式
可重入函式 reentrant function 與執行緒安全函式 thread safe function 有時容易混淆,而且各種文件中的解釋也不是很清楚,這裡根據筆者的經驗來說明一下。執行緒安全函式 概念 執行緒安全的概念比較直觀。一般說來,乙個函式被稱為執行緒安全的,當且僅當被多個併發執行緒反...