Qt,QMutex是如何工作的?似乎没有';行不通

Qt,QMutex是如何工作的?似乎没有';行不通,qt,Qt,我的代码如下: int main(int argc, char* argv[]) { MyThread myThread1; MyThread myThread2; myThread1.start(); myThread2.start(); qDebug("Hello World"); myThread1.wait(); qDebug("myThread1 is finished..."); myThread2.wait();

我的代码如下:

int main(int argc, char* argv[])
{
    MyThread myThread1;
    MyThread myThread2;
    myThread1.start();
    myThread2.start();

    qDebug("Hello World");

    myThread1.wait();
    qDebug("myThread1 is finished...");
    myThread2.wait();
    qDebug("myThread2 is finished...");

    return 0;
}
>

>

但结果是:

Hello World
5516, x = 10000 
6060, x = 10000 
5516, x = 9999 
6060, x = 9999 
5516, x = 9998 
6060, x = 9998 
5516, x = 9997 
6060, x = 9997
...
...
我想说的是,结果是:

xxxx: 10000 xxxx: 9999 xxxx: 9998 xxxx: 9997 ... ... xxxx: 1 yyyy: 10000 yyyy: 9999 ... ... yyyy: 1 xxxx:10000 xxxx:9999 xxxx:9998 xxxx:9997 ... ... xxxx:1 yyyy:10000 yyyy:9999 ... ... yyyy:1
为什么?我的错在哪里?以及如何使用QMutex。。谢谢…

您的互斥对象是本地对象。因此,线程使用不同的互斥锁,锁定一个互斥锁不会影响另一个互斥锁

要修复它,请将
QMutex
对象移动到两个线程都可以访问它的位置。例如,将其设为全局变量


此外,在函数中使用RAII样式的
QMutexLocker
比显式调用
lock()
unlock()
更容易。

您的互斥对象是本地对象。因此,线程使用不同的互斥锁,锁定一个互斥锁不会影响另一个互斥锁

要修复它,请将
QMutex
对象移动到两个线程都可以访问它的位置。例如,将其设为全局变量


另外,在函数中使用RAII样式的
QMutexLocker
比显式调用
lock()
unlock()
更容易。

您正在运行调用的范围内创建互斥锁。如果希望互斥体停止/延迟thread2的执行,则需要声明,以便对象不会每次都创建自己的互斥体

// .h
class MyThread {
   ...
private:
 static QMutex mutex;
}


// .cpp
QMutex MyThread::mutex; 



// .cpp
void MyThread::run()
{
  QMutexLocker lock(&mutex)

  // do stuff then return 
  // and the mutex will be unlocked when 
  // you leave this scope
}

您正在运行调用的范围内创建互斥体。如果希望互斥体停止/延迟thread2的执行,则需要声明,以便对象不会每次都创建自己的互斥体

// .h
class MyThread {
   ...
private:
 static QMutex mutex;
}


// .cpp
QMutex MyThread::mutex; 



// .cpp
void MyThread::run()
{
  QMutexLocker lock(&mutex)

  // do stuff then return 
  // and the mutex will be unlocked when 
  // you leave this scope
}

你可以看看开发人员的解释

这是一个很好的无锁编程,很难重新实现,甚至更难调试和验证

然而,它指出了Linux,它
QMutex
在Linux平台上使用 如果可移植性不是一个问题,您可能希望使用它

这回答了您的问题标签


然而,在你的特殊情况下,你并不真的需要它。只需创建一个由所有工作线程共享的全局互斥就可以了。

您可以看看开发人员的解释

这是一个很好的无锁编程,很难重新实现,甚至更难调试和验证

然而,它指出了Linux,它
QMutex
在Linux平台上使用 如果可移植性不是一个问题,您可能希望使用它

这回答了您的问题标签


然而,在你的特殊情况下,你并不真的需要它。只需创建一个由所有工作线程共享的全局互斥就可以了。

如果要按顺序运行任务,线程有什么意义?我更新了代码。。谢谢你…还是。。。是否希望线程2仅在线程1完成时启动?如果是,为什么有两个线程?你的代码中有很多不正确的地方,但我不确定你想做什么。请解释一下。事实上,我只是想知道如何使用QMutex..o(∩_∩)当你想按顺序运行任务时,线程有什么意义?我更新了代码。谢谢你…仍然…你想只在线程一完成时启动线程二吗?如果是,为什么你有两个线程?你的代码中有很多不正确的东西,但我不确定你想做什么。请解释一下。在事实上,我只是想知道如何使用QMutex..o(∩_∩)o
// .h
class MyThread {
   ...
private:
 static QMutex mutex;
}


// .cpp
QMutex MyThread::mutex; 



// .cpp
void MyThread::run()
{
  QMutexLocker lock(&mutex)

  // do stuff then return 
  // and the mutex will be unlocked when 
  // you leave this scope
}