QT:互斥量

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章