QT中的多執行緒(一)

2021-05-25 04:41:34 字數 2186 閱讀 8058

qt通過三種形式提供了對執行緒的支援。它們分別是,一、平台無關 的執行緒類,二、執行緒安全的事件投遞,三、跨執行緒的訊號-槽連線。這使得開發輕巧的多執行緒qt程式更為容易, 並能充分利用多處理器機器的優勢。多執行緒程式設計也是乙個有用的模式,它用於解決執行較長時間的操作而不至於使用者介面失去響應。在qt的早期版本中,在構建庫 時有不選擇執行緒支援的選項,從4.0開始,執行緒總是有效的。

線 程類

qt 包含下面一些執行緒相關的類:

qthread 提供了開始乙個新執行緒的方法

qthreadstorage 提供逐執行緒資料儲存

qmutex  提供相互排斥的鎖,或互斥量

qmutexlocker 是乙個便利類,它可以自動對qmutex加鎖與解鎖

qreadwriterlock 提供了乙個可以同時讀操作的鎖

qreadlocker與qwritelocker 是便利類,它自動對qreadwritelock加鎖與解鎖

qsemaphore 提供了乙個整型訊號量,是互斥量的泛化

qwaitcondition 提供了一種方法,使得執行緒可以在被另外執行緒喚醒之前一直休眠。

建立乙個執行緒

為建立乙個執行緒,子類化qthread並且重寫它的run()函式,例如:

class mythread : public qthread

;執行緒同步

qmutex, qreadwritelock, qsemaphore,  qwaitcondition 提供了執行緒同步的手段。使用執行緒的主要想法是希望它們可以盡可能併發執行,而一些關鍵點上線程之間需要停止或等待。例如,假如兩個執行緒試圖同時訪問同乙個 全域性變數,結果可能不如所願。

qmutex  提供相互排斥的鎖,或互斥量。在乙個時刻至多乙個執行緒擁有mutex,假如乙個執行緒試圖訪問已經被鎖定的mutex,那麼它將休眠,直到擁有mutex的 執行緒對此mutex解鎖。mutexes常用來保護共享資料訪問。

qreadwriterlock 與qmutex相似,除了它對 "read","write"訪問進行區別對待。它使得多個讀者可以共時訪問資料。使用qreadwritelock而不是qmutex,可以使得多執行緒 程式更具有併發性。

qreadwritelock lock;

void readerthread::run()

void writerthread::run()

qsemaphore 是qmutex的一般化,它可以保護一定數量的相同資源,與此相對,乙個 mutex只保護乙個資源。下面例子中,使用qsemaphore來 控制對環狀緩衝的訪問,此緩衝區被生產者執行緒和消費者執行緒共享。生產者不斷向緩衝寫入資料直到緩衝末端,再從頭開始。消費者從緩衝不斷讀取資料。訊號量比 互斥量有更好的併發性,假如我們用互斥量來控制對緩衝的訪問,那麼生產者,消費者不能同時訪問緩衝。然而,我們知道在同一時刻,不同執行緒訪問緩衝的不同部 分並沒有什麼危害。

const int datasize = 100000;

const int buffersize = 8192;

char buffer[buffersize];

qsemaphore freebytes(buffersize);

qsemaphore usedbytes;

class producer : public qthread

;void producer::run()

}class consumer : public qthread

;void consumer::run()

fprintf(stderr, "/n");

}const int datasize = 100000;

const int buffersize = 8192;

char buffer[buffersize];

qwaitcondition buffernotempty;

qwaitcondition buffernotfull;

qmutex mutex;

int numusedbytes = 0;

class producer : public qthread

;void producer::run()

}class consumer : public qthread

;void consumer::run()

fprintf(stderr, "/n");

}

Qt 中的多執行緒 一

qt通過三種形式提供了對執行緒的支援。它們分別是,一 平台無關的執行緒類,二 執行緒安全的事件投遞,三 跨執行緒的訊號 槽連線。這使得開發輕巧的多執行緒qt程式更為容易,並能充分利用多處理器機器的優勢。多執行緒程式設計也是乙個有用的模式,它用於解決執行較長時間的操作而不至於使用者介面失去響應。在qt...

QT中的多執行緒(一)

qt中的多執行緒 一 華麗麗的分割線 十分感謝原文作者,幫我解決了近幾日的疑惑,對於qt的執行緒間的通訊有了進一步了解,在這裡向他致以我崇高的敬意。華麗麗的分割 線 qt通過三種形式提供了對執行緒的支援。它們分別是,一 平台無關 的執行緒類,二 執行緒安全的事件投遞,三 跨執行緒的訊號 槽連線。這使...

Qt中的多執行緒程式設計

qt中的多執行緒程式設計 qthread 類,該類提供了建立乙個新執行緒以及控制線程執行的各種方法。執行緒是通過 qthread run 過載函式開始執行的 在 qt 系統中,始終執行著乙個gui 主事件執行緒,這個主線程從視窗系統中獲取事件,並將它們分發到各個元件去處理。在 qthread 類中還...