一、qt中使用多執行緒時候,多執行緒的同步就是乙個不可避免的問題。多執行緒的同步就是使多個執行緒在同時執行同一段**的時候,有順序的執行,不會出現同時有兩個或者多個執行緒執行同一段**的情況,特別是在對變數或者檔案執行寫操作的時候。也就是所謂的執行緒安全,執行緒安全指的是這段**在乙個執行緒或者多個執行緒執行的過程中,不加同步機制或者任何其他**,執行的結果是一樣的,這就是執行緒安全。
在qt中常用的同步方法是使用鎖機制,但是如果使用的方法不對或者時機不對同樣也不會起到執行緒同步的效果。例如:
執行緒類:
#pragma once
#include
#include
class mythread : public qthread ;
#include "mythread.h"
#include
static
int cnt = 0;
mythread::mythread(qobject *parent)
: qthread(parent)
mythread::~mythread()
void mythread::run()
}
介面類:
#pragma once
#include
#include "ui_multithread.h"
class mythread;
class multithread : public qmainwindow ;
#include
"multithread.h"
#include
"mythread.h"
multithread::multithread(qwidget *
parent)
: qmainwindow(parent)
以上是兩個執行緒同時對同乙個靜態變數進行寫操作。
開始執行,然後檢視列印結果:
怎麼兩個同時執行的執行緒,出來的相同的結果,難道執行緒同步沒有起作用?這是怎麼回事?
仔細一想發現了問題,原來是雖然新增了兩個執行緒物件,但是每個執行緒物件都建立了乙個qmutex物件,兩個執行緒在執行過程中各自執行的是自己的鎖,所以每個鎖有且只有乙個執行緒在執行。它們是互不干擾的,所有雖然加鎖了,也沒有起到同步的作用,那麼如果讓鎖發揮作用呢?修改一下**,讓兩個執行緒使用同乙個鎖:
#pragma once
#include
#include
class mythread : public qthread ;
#include "mythread.h"
#include
static
int cnt = 0;
static qmutex mutex;
mythread::mythread(qobject *parent)
: qthread(parent)
mythread::~mythread()
void mythread::run()
}
然後在執行一下,這樣結果就正確了,結果沒有出現重複的,實現了執行緒同步:
二、還可以使用qmutexlocker類實現鎖同步機制。
qt提供的qmutexlocker可以簡化互斥量的操作,它在建構函式中接受乙個qmutex的物件作為引數並將其鎖定,在析構函式中解鎖這個互斥量,也是很方便的,咱們在同時修改一下**:
#include "mythread.h"
#include
static
int cnt = 0;
static qmutex mutex;
mythread::mythread(qobject *parent)
: qthread(parent)
mythread::~mythread()
void mythread::run()
}
那麼這個訊號量保護的是哪一部分**呢?while迴圈結束。因為qmutexlocker物件是乙個臨時的區域性物件,當迴圈完成之後,這個物件也就釋放了,同時也就解鎖了。執行一下!
同樣也是沒有重複的資料。以上!
Qt 多執行緒同步之互斥鎖
qmutex需要配對使用lock 和unlock 來實現 段的保護 qmutexlocker是另外乙個簡化了互斥量處理的類。qmutexlocker建構函式接受乙個互斥量作為引數並將其鎖定,qmutexlocker的析構函式則將此互斥量解鎖,所以在qmutexlocker例項變數的生存期內的 段得到...
Qt 多執行緒同步之條件變數
qwaitcondition與qmutex結合,可以使乙個執行緒在滿足一定條件時通知其他多個執行緒,使它們及時作出響應,這樣比只使用互斥量效率要高一些。常用api 生產者 消費者模型 ifndef mythread h define mythread h include include includ...
Qt多執行緒基礎(一)執行緒同步之互斥鎖同步
一 直接使用qmutex進行同步 建立執行緒方法 繼承自qthread,重寫void run 函式,呼叫成員start 啟動執行緒,start 中可加入優先順序引數。互斥鎖同步方法 void run 函式中使用qmutex來實現同步,當多個執行緒訪問共享變數時,應使用lock trylock和unl...