QT執行緒同步誤區 全域性的互斥量QMutex

2021-09-13 23:01:38 字數 1518 閱讀 7860

執行緒同步:qt中使用多執行緒時候,多執行緒的同步就是乙個不可避免的問題。

多執行緒的同步就是使多個執行緒在同時執行同一段**的時候,有順序的執行,不會出現同時有兩個或者多個執行緒執行同一段**的情況,特別是在對變數或者檔案執行寫操作的時候。也就是所謂的執行緒安全,執行緒安全指的是這段**在乙個執行緒或者多個執行緒執行的過程中,不加同步機制或者任何其他**,執行的結果是一樣的,這就是執行緒安全。

在qt中常用的同步方法是使用鎖機制,但是如果使用的方法不對或者時機不對同樣也不會起到執行緒同步的效果。

例如: 有兩個程序都對乙個變數進行讀寫操作,這時就需要互斥量來進行執行緒同步,這個互斥量必須是全域性的,不然如果各自在.cpp中宣告乙個qmutex mutex;是沒有任何意義的。因為:每個執行緒物件都建立了乙個qmutex物件,兩個執行緒在執行過程中各自執行的是自己的鎖,所以每個鎖有且只有乙個執行緒在執行。它們是互不干擾的,所有雖然加鎖了,也沒有起到同步的作用。

程式功能:

執行緒1:每五秒讀寫一次全部變數globalcount

執行緒2:每1秒讀寫一次全部變數globalcount

下面程式的實驗現象是:

當執行緒1在讀寫資料時,執行緒2會阻塞住(大概5s)等執行緒1釋放鎖才能使用

當執行緒2在讀寫資料時,執行緒1會阻塞住(大概1s)等執行緒2釋放鎖才能使用

//執行緒1:mythread.cpp

#include "mythread.h"

#include qmutex mutex;

extern int globalcount ;

mythread::mythread()

void mythread::closethread()

//重寫基類的run函式

void mythread::run()//只有run()裡面在新的執行緒裡

qmutexlocker locker(&mutex);

qdebug()<

#include "mythread1.h"

#include extern qmutex mutex;

qmutex mutex1;

extern int globalcount ;

mythread1::mythread1(qobject *parent) : qobject(parent)

void mythread1::closethread()

void mythread1::dowork()

// qmutexlocker locker(&mutex);

// qdebug()<

// }

}void mythread1::ontimeout()

執行緒同步 互斥量

下面以乙個簡單的多執行緒程式來演示如何使用互斥量來進行執行緒同步。在主線程中,我們建立子執行緒,並把陣列msg作為引數傳遞給子執行緒,然後主線程呼叫函式pthread mutex lock對互斥量加鎖,等待輸入,輸入完成後,呼叫函式pthread mutex unlock對互斥量解鎖,從而使執行緒函...

執行緒同步 互斥量

互斥量的使用 執行緒同步之互斥量 include include include include include include include using namespace std 全域性變數,兩個執行緒都可以修改,因此修改的時候需要加鎖 int g value 0 互斥量 pthread mu...

執行緒同步(互斥量)

原理 建立與銷毀 include int pthread mutex init pthread mutex t restrict mutex,const pthread mutexattr t restrict attr int pthread mutex destroy pthread mutex...