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
}