QMutex類提供了一種保護一個變量或一段代碼的方法。
QMutex主要包含3個方法:
QMutex mutex;
Mutex.lock();
如果互斥量mutex處於解鎖狀態,那麼當前線程立刻鎖定它,否則當前線程被阻塞直到佔用該mutex的線程對它解鎖爲止。
Mutex.unlock();
解鎖。
Mutex.tryLock();
如果互斥量mutex處於解鎖狀態,那麼當前線程立刻鎖定它,否則當前線程立即返回。
保護一段代碼:
#include "thread_even.h"
#include <iostream>
QMutex mutex;
Thread_even::Thread_even()
{
}
void Thread_even::run()
{
mutex.lock();
for(int i=0; i<10; i+=2)
{
std::cout << i << std::endl;
sleep(1);
}
mutex.unlock();
}
#include "thread_odd.h"
#include <iostream>
extern QMutex mutex;
Thread_odd::Thread_odd()
{
}
void Thread_odd::run()
{
mutex.lock();
for(int i=1; i<10; i+=2)
{
std::cout << i << std::endl;
sleep(1);
}
mutex.unlock();
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
Thread_even even;
Thread_odd odd;
even.start();
odd.start();
return a.exec();
}
當不使用互斥量進行保護時,打印的內容爲:
0 1 2 3 4 5 6 7 8 9
使用互斥量進行保護後,打印的內容爲:
0 2 4 6 8 1 3 5 7 9
保護共享變量
#include "thread_even.h"
#include <iostream>
QMutex mutex;
int global_x = 0;
Thread_even::Thread_even()
{
}
void Thread_even::run()
{
mutex.lock();
global_x = 0;
for(int i=0; i<10; i+=2)
{
global_x += 2;
std::cout << global_x << std::endl;
sleep(1);
}
mutex.unlock();
}
#include "thread_odd.h"
#include <iostream>
extern QMutex mutex;
extern int global_x;
Thread_odd::Thread_odd()
{
}
void Thread_odd::run()
{
mutex.lock();
global_x = 1;
for(int i=1; i<10; i+=2)
{
global_x +=2;
std::cout << global_x << std::endl;
sleep(1);
}
mutex.unlock();
}
當不使用互斥量進行保護時,打印的內容爲:
2 3 5 7 9 11 13 15 17 19
使用互斥量進行保護後,打印的內容爲:
3 5 7 9 11 2 4 6 8 10