函式可重入與執行緒安全的QT官方解釋

2021-10-08 03:27:35 字數 1291 閱讀 8464

術語「可重入」和「執行緒安全」用以指示函式如何在多執行緒應用程式中使用:

因此,執行緒安全函式始終是可重入的,但可重入函式並非始終是執行緒安全的。

擴充套件一下,如果可以從多個執行緒安全地呼叫類的成員函式,則該類稱為可重入的,只要每個執行緒使用該類的不同例項即可。如果可以從多個執行緒安全地呼叫其成員函式,則該類是執行緒安全的,即使所有執行緒都使用該類的相同例項也是如此。

注意:如果打算將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 有時容易混淆,而且各種文件中的解釋也不是很清楚,這裡根據筆者的經驗來說明一下。執行緒安全函式 概念 執行緒安全的概念比較直觀。一般說來,乙個函式被稱為執行緒安全的,當且僅當被多個併發執行緒反...