qt中的多執行緒(一)
/************************************華麗麗的分割線*************************************/
十分感謝原文作者,幫我解決了近幾日的疑惑,對於qt的執行緒間的通訊有了進一步了解,在這裡向他致以我崇高的敬意。
/************************************華麗麗的分割 線*************************************/
qt通過三種形式提供了對執行緒的支援。它們分別是,一、平台無關 的執行緒類,二、執行緒安全的事件投遞,三、跨執行緒的訊號-槽連線。這使得開發輕巧的多執行緒qt程式更為容易, 並能充分利用多處理器機器的優勢。多執行緒程式設計也是乙個有用的模式,它用於解決執行較長時間的操作而不至於使用者介面失去響應。在qt的早期版本中,在構建庫 時有不選擇執行緒支援的選項,從4.0開始,執行緒總是有效的。
線 程類
qthread 提供了開始乙個新執行緒的方法
qthreadstorage 提供逐執行緒資料儲存
qmutex 提供相互排斥的鎖,或互斥量
qmutexlocker 是乙個便利類,它可以自動對qmutex加鎖與解鎖
qreadwriterlock 提供了乙個可以同時讀操作的鎖
qreadlocker與qwritelocker 是便利類,它自動對qreadwritelock加鎖與解鎖
qsemaphore 提供了乙個整型訊號量,是互斥量的泛化
qwaitcondition 提供了一種方法,使得執行緒可以在被另外執行緒喚醒之前一直休眠。
建立乙個執行緒
為建立乙個執行緒,子類化qthread並且重寫它的run()函式,例如:
class mythread : public qthread
q_object
protected:
void run();
void mythread::run()
之後,建立這個執行緒物件的例項,呼叫 qthread::start()。於是,在run()裡出現的**將會在另外執行緒中被執行。
執行緒同步
qmutex, qreadwritelock, qsemaphore, qwaitcondition 提供了執行緒同步的手段。使用執行緒的主要想法是希望它們可以盡可能併發執行,而一些關鍵點上線程之間需要停止或等待。例如,假如兩個執行緒試圖同時訪問同乙個 全域性變數,結果可能不如所願。
qmutex 提供相互排斥的鎖,或互斥量。在乙個時刻至多乙個執行緒擁有mutex,假如乙個執行緒試圖訪問已經被鎖定的mutex,那麼它將休眠,直到擁有mutex的 執行緒對此mutex解鎖。mutexes常用來保護共享資料訪問。
qreadwriterlock 與qmutex相似,除了它對 "read","write"訪問進行區別對待。它使得多個讀者可以共時訪問資料。使用qreadwritelock而不是qmutex,可以使得多執行緒 程式更具有併發性。
qreadwritelock lock;
void readerthread::run()
lock.lockforread();
read_file();
lock.unlock();
void writerthread::run()
lock.lockforwrite();
write_file();
lock.unlock();
qsemaphore 是qmutex的一般化,它可以保護一定數量的相同資源,與此相對,乙個 mutex只保護乙個資源。下面例子中,使用qsemaphore來 控制對環狀緩衝的訪問,此緩衝區被生產者執行緒和消費者執行緒共享。生產者不斷向緩衝寫入資料直到緩衝末端,再從頭開始。消費者從緩衝不斷讀取資料。訊號量比 互斥量有更好的併發性,假如我們用互斥量來控制對緩衝的訪問,那麼生產者,消費者不能同時訪問緩衝。然而,我們知道在同一時刻,不同執行緒訪問緩衝的不同部 分並沒有什麼危害。
const int datasize = 100000;
const int buffersize = 8192;
char buffer[buffersize];
qsemaphore freebytes(buffersize);
qsemaphore usedbytes;
class producer : public qthread
public:
void run();
void producer::run()
qsrand(qtime(0,0,0).secsto(qtime::currenttime()));
for (int i = 0; i < datasize; ++i) {
freebytes.acquire();
buffer[i % buffersize] = "acgt"[(int)qrand() % 4];
usedbytes.release();
class consumer : public qthread
public:
void run();
void consumer::run()
for (int i = 0; i < datasize; ++i) {
usedbytes.acquire();
fprintf(stderr, "%c", buffer[i % buffersize]);
freebytes.release();
fprintf(stderr, "/n");
int main(int argc, char *argv)
producer producer;
consumer consumer;
producer.start();
consumer.start();
producer.wait();
consumer.wait();
return 0;
qwaitcondition 允許執行緒在某些情況發生時喚醒另外的執行緒。乙個或多個執行緒可以阻塞等待一qwaitcondition ,用wakeone()或wakeall()設定乙個條件。wakeone()隨機喚醒乙個,wakeall()喚醒所有。
const int datasize = 100000;
const int buffersize = 8192;
char buffer[buffersize];
qwaitcondition buffernotempty;
qwaitcondition buffernotfull;
qmutex mutex;
int numusedbytes = 0;
class producer : public qthread
public:
void run();
void producer::run()
qsrand(qtime(0,0,0).secsto(qtime::currenttime()));
for (int i = 0; i < datasize; ++i) {
mutex.lock();
if (numusedbytes == buffersize)
buffernotfull.wait(&mutex);
mutex.unlock();
buffer[i % buffersize] = "acgt"[(int)qrand() % 4];
mutex.lock();
++numusedbytes;
buffernotempty.wakeall();
mutex.unlock();
class consumer : public qthread
public:
void run();
void consumer::run()
for (int i = 0; i < datasize; ++i) {
mutex.lock();
if (numusedbytes == 0)
buffernotempty.wait(&mutex);
mutex.unlock();
fprintf(stderr, "%c", buffer[i % buffersize]);
mutex.lock();
--numusedbytes;
buffernotfull.wakeall();
mutex.unlock();
fprintf(stderr, "/n");
int main(int argc, char *argv)
producer producer;
consumer consumer;
producer.start();
consumer.start();
producer.wait();
consumer.wait();
return 0;
QT中的多執行緒(一)
qt通過三種形式提供了對執行緒的支援。它們分別是,一 平台無關 的執行緒類,二 執行緒安全的事件投遞,三 跨執行緒的訊號 槽連線。這使得開發輕巧的多執行緒qt程式更為容易,並能充分利用多處理器機器的優勢。多執行緒程式設計也是乙個有用的模式,它用於解決執行較長時間的操作而不至於使用者介面失去響應。在q...
Qt 中的多執行緒 一
qt通過三種形式提供了對執行緒的支援。它們分別是,一 平台無關的執行緒類,二 執行緒安全的事件投遞,三 跨執行緒的訊號 槽連線。這使得開發輕巧的多執行緒qt程式更為容易,並能充分利用多處理器機器的優勢。多執行緒程式設計也是乙個有用的模式,它用於解決執行較長時間的操作而不至於使用者介面失去響應。在qt...
Qt中的多執行緒程式設計
qt中的多執行緒程式設計 qthread 類,該類提供了建立乙個新執行緒以及控制線程執行的各種方法。執行緒是通過 qthread run 過載函式開始執行的 在 qt 系統中,始終執行著乙個gui 主事件執行緒,這個主線程從視窗系統中獲取事件,並將它們分發到各個元件去處理。在 qthread 類中還...