執行緒和並行程式設計之可重入和執行緒安全(五)

2021-08-28 10:37:30 字數 1098 閱讀 9014

檢視qt的幫助文件,經常看到函式標識「可重入」和「執行緒安全」,這些說明了在多執行緒程式中是如何使用的:

執行緒安全:函式可以被多個執行緒同時呼叫,甚至是呼叫方使用共享資料。因為所有對共享資料的引用是序列化的。

可重入:函式可以被多個執行緒同時呼叫,但是呼叫方需要使用獨自的資料。

簡述:執行緒安全的函式是可重入的,但是可重入的函式不一定是執行緒安全的。引申來說:

執行緒安全的類:它的成員函式可被多執行緒安全呼叫,即使多個執行緒使用的是同乙個類的例項。

可重入的類:它的成員函式可被多執行緒安全呼叫,但每個執行緒使用類的不同例項。

任何執行緒可以呼叫乙個可重入的類例項的成員函式,只要同一時刻其他的執行緒不會呼叫相同例項的成員函式。可重入類如下所示:

class counter

void increment()

void decrement()

int value() const

private:

int n;

};

該類不是執行緒安全的,如果多個執行緒同時嘗試修改變數n,原因就在於++/–不是原子操作。通過檢視彙編,對應3條指令:

載入變數值到暫存器(mov)

增加/減少暫存器的值(add)

將暫存器的值返回到記憶體中(mov)

一種使類變成執行緒安全的簡單方式:對資料成員的訪問使用qmutex。

class counter

void increment()

void decrement()

int value() const

private:

mutable qmutex mutex;

int n;

};

qmutexlocker的用法前一章已講解。

許多qt的類都是可重入的,但不是執行緒安全的。因為頻繁的對互斥量加鎖解鎖會帶來一定的效能損耗。例如,qstring是可重入但不是執行緒安全。多執行緒可同時的訪問qstring類的不同例項,但不能同時訪問qstring類的相同例項(除非加鎖)

執行緒和並行程式設計之執行緒同步(四)

執行緒的目的是為了並行的執行 有時執行緒需要互相等待。例如,如果兩個執行緒同時寫乙個變數,執行結果是未定義的。因此對共享資源的需要進行 同步 處理。qt提供了低階別的 高階別的機制處理執行緒同步。上述同步類可以保證函式的執行緒安全。但是為了保證函式執行緒安全,會有效能的損耗,這也是為什麼qt部分函式...

可重入和執行緒安全

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

可重入和執行緒安全

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