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

展开阅读全文

没有更多推荐了,返回首页