QMutex多线程中的互斥锁

    xiaoxiao2021-03-25  78

    QMutex类提供了使线程之间序列化。

    QMutex的目的就是为了保护一个对象,数据结构或者一部分的代码在某个时期只能被唯一的一个线程访问(这点有点类似于Java的同步关键字)。它通常和QMutexLocker一起使用,因为这会让锁定和解锁表现的一致。

    例如这样的一段代码:

    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

    如果他们同时被两个线程调用,结果就可能是这样的:

    // Thread 1 calls method1() number *= 5; // number is now 30 // Thread 2 calls method2(). // // Most likely Thread 1 has been put to sleep by the operating // system to allow Thread 2 to run. number *= 3; // number is now 90 number /= 2; // number is now 45 // Thread 1 finishes executing. number /= 4; // number is now 11, instead of 10

    如果我们加上互斥,就能得到我们想要的结果:

    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(); }

    这样任何时候只能仅有一个线程可以修改数值,从而能保证结果的正确性。当然这是一个简单的例子,但是如果应用到其他的情形可能要做特定的调整。

    当你调用lock()在线程中,其他的线程如果也在同样的地方调用lock()需要等到这个被锁定的地方被unlock().一个非阻塞解锁方式就是调用tryLock()而不是lock().

    QMutex在非竞争线程中被认为是最佳的快速同步的方式。一种非递归的QMutex不会分配内存,如果没有互斥锁的竞争。

    而QMutexLocker是用来简化锁定和解锁的另外一个类。

    转载请注明原文地址: https://ju.6miu.com/read-21656.html

    最新回复(0)