qt 多執行緒之可重入與執行緒安全是本節要介紹的內容。在qt文件中,術語「可重入」與「執行緒安全」被用來說明乙個函式如何用於多執行緒程式。假如乙個類的任何函式在此類的多個不同的例項上,可以被多個執行緒同時呼叫,那麼這個類被稱為是「可重入」的。假如不同的執行緒作用在同乙個例項上仍可以正常工作,那麼稱之為「執行緒安全」的。
大多數c++類天生就是可重入的,因為它們典型地僅僅引用成員資料。任何執行緒可以在類的乙個例項上呼叫這樣的成員函式,只要沒有別的執行緒在同乙個例項上呼叫這個成員函式。舉例來講,下面的counter 類是可重入的:
class counter
void increment()
void decrement()
int value() const
private:
int n;
};這個類不是執行緒安全的,因為假如多個執行緒都試圖修改資料成員 n,結果未定義。這是因為c++中的++和--操作符不是原子操作。實際上,它們會被擴充套件為三個機器指令:
1,把變數值裝入暫存器
2,增加或減少暫存器中的值
3,把暫存器中的值寫回記憶體
假如執行緒a與b同時裝載變數的舊值,在暫存器中增值,回寫。他們寫操作重疊了,導致變數值僅增加了一次。很明顯,訪問應該序列化:a執行123步驟時不應被打斷。使這個類成為執行緒安全的最簡單方法是使用qmutex來保護資料成員:
class counter
void increment()
void decrement()
int value() const
private:
mutable qmutex mutex;
int n;
};qmutexlocker類在建構函式中自動對mutex進行加鎖,在析構函式中進行解鎖。隨便一提的是,mutex使用了mutable關鍵字來修飾,因為我們在value()函式中對mutex進行加鎖與解鎖操作,而value()是乙個const函式。
執行緒與qobjects
qthread 繼承自qobject,它發射訊號以指示執行緒執行開始與結束,而且也提供了許多slots。更有趣的是,qobjects可以用於多執行緒,這是因為每個執行緒被允許有它自己的事件迴圈。
qobject 可重入性
qobject是可重入的。它的大多數非gui子類,像qtimer,qtcpsocket,qudpsocket,qhttp,qftp,qprocess也是可重入的,在多個執行緒中同時使用這些類是可能的。需要注意的是,這些類被設計成在乙個單執行緒中建立與使用,因此,在乙個執行緒中建立乙個物件,而在另外的執行緒中呼叫它的函式,這樣的行為不能保證工作良好。有三種約束需要注意:
1,qobject的孩子總是應該在它父親被建立的那個執行緒中建立。這意味著,你絕不應該傳遞qthread物件作為另乙個物件的父親(因為qthread物件本身會在另乙個執行緒中被建立)
2,事件驅動物件僅僅在單執行緒中使用。明確地說,這個規則適用於"定時器機制「與」網格模組「,舉例來講,你不應該在乙個執行緒中開始乙個定時器或是連線乙個套接字,當這個執行緒不是這些物件所在的執行緒。
Qt之可重入與執行緒安全
本篇文章中,術語 可重入性 和 執行緒安全 被用來標記類與函式,以表明它們如何被應用在多執行緒應用程式中。因此,乙個執行緒安全的函式總是可重入的,但乙個可重入的函式並不一定是執行緒安全的。擴充套件開來,乙個可重入的類,指的是它的成員函式可以被多個執行緒安全地呼叫,只要每個執行緒使用這個類的不同的物件...
Qt之可重入與執行緒安全
本篇文章中,術語 可重入性 和 執行緒安全 被用來標記類與函式,以表明它們如何被應用在多執行緒應用程式中。因此,乙個執行緒安全的函式總是可重入的,但乙個可重入的函式並不一定是執行緒安全的。擴充套件開來,乙個可重入的類,指的是它的成員函式可以被多個執行緒安全地呼叫,只要每個執行緒使用這個類的不同的物件...
多執行緒之可重入鎖
當乙個執行緒得到物件鎖後,再次請求此物件鎖時是可以再次得到改物件的鎖的 可重入鎖 的概念 自己可以再次獲得自己內部的鎖,比如有一條執行緒獲得了某個物件的鎖,此時這個物件的鎖還沒有釋放,當再次獲取這個物件的鎖的時候還是可以獲取的,如果不可鎖重入的話就會造成死鎖。例如 synchronized和reen...