QT中的多執行緒(一)

2021-08-25 07:26:28 字數 4366 閱讀 7526

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 類中還...