Qt之多线程-QMutex

在多线程的概念中,如果多个线程同时的去修改某一个变量,这样会导致最终的结果出现偏差。为了解决此类问题,在多线程中引入互斥量的概念,通过它来保护一个变量、一段代码块,防止同时操作某一个变量的事件发生。在QT中,通过QMutex类来实现互斥的功能。

例如,下面的一段代码:

int number = 6;

void method1()
{
    number *= 5;
    number /= 4;
}
void method2()
{
    number *= 3;
    number /= 2;
}

如果这两个函数按照顺序执行,则会产生如下的结果:

//method1()
number *= 5;    //number is now 30
number /= 4;    //number is now 7

//method2()
number *= 3;    //number is now 21
number /= 2;    //number is now 10

如果这两个函数分别在两个线程中并且同时执行,则可能会产生如下结果:

//Thread1 calls method1()
number *= 5;    //number is now 30

//Thread2 calls method2()
//此时线程1会处于睡眠状态
number *= 3;    //number is now 90;
number /= 2;    //number is now 45;

//Thread1 finishes executing
number /= 4;    //number is now 11, instead of 10

为了防止上面的情况发生,我们添加一个全局的QMutex变量mutex,这样就可以得到我们期望的结果:

QMutex mutex;
int number = 6;

void method1()
{
    mutex.lock();
    number *= 5;
    number /= 4;
    mutex.unlock();
}
void method2()
{
    mutex.lock();
    number *= 3;
    number /= 2;
    mutex.unlock();
}

经过上面的修改后,在同一时间只能有一个线程可以修改number。当某一线程调用lock()成功后,其它的线程调用lock()会被阻塞,直到之前的线程调用unlock()。

你可能感兴趣的:(QT)