何时在C++Qt中使用QMutex

When to use QMutex in C++ Qt?

本文关键字:QMutex C++Qt 何时      更新时间:2023-10-16

我有 2 种情况,我不知道我是否应该使用 QMutex。我已经多次在没有QMutex的情况下运行该程序,它没有向我显示任何异常行为。为了简单起见,我在这里浏览了代码。但为了安全起见,我仍然想知道我是否应该使用QMutex

场景 #1:

 class A : QObject
 {
    Q_OBJECT
    private double **array;//it is initialised in the constructor & is 100x100
    slots:
          slot1(); //2 Qthreads are created in my main GUI thread along with 2 objects of class A, & by A aobj.movetothread();
          slot2(); //& connecting these 2 slots to started() SIGNAL of respective QThread's
                   //I have multi-threaded my application.
 }
 A::slot1()
 {
    double temp = array[i][j];
    //some operations on temp
 }
 A::slot2()
 {
    double temp = array[i][j];
    //some operations on temp
 }

注意:初始化后,array[][]的内容不会更改。我只在 2 个线程访问它的信息。但是,有时两个线程可能会同时访问array中的相同元素

场景 #2

 A::slot1()
 {
    double temp = somefunc();
    array[0][j] = temp;
 }
 A::slot2()
 {
    double temp = somefunc();
    array[50][j] = temp;
 }

注意:在这种情况下,2 个线程修改来自同一数组的元素,但是它们不修改/访问公共元素,即 thread1 处理前 50 行,而 thread2 处理接下来的 50 行,但它们甚至不访问彼此的

如果这些方案不能一起运行,则不需要互斥锁。 访问数据以从两个线程读取是可以的,在两个(甚至多个线程)中修改同一数组中的不同元素也是可以的。 需要互斥锁的情况是,当两个线程修改数组中的相同元素时,或者从一个线程修改相同的元素,同时从另一个线程读取它们