就上面的例子,我在Worker类的doWork槽函数中循环打印输出1-15;当我创建两个Worker子线程时就有问题了,打印不完整,为什么
时间: 2024-04-12 07:30:56 浏览: 52
在你的例子中,当你创建两个 Worker 子线程时,可能会出现打印不完整的问题,这是因为你的程序没有进行适当的并发控制。
在没有并发控制的情况下,两个 Worker 子线程可能会同时尝试访问标准输出流(stdout),导致输出内容交错和不完整。
为了解决这个问题,你可以使用互斥锁(QMutex)来确保只有一个线程可以访问标准输出流。以下是修改后的代码示例:
```cpp
#include <QThread>
#include <QObject>
#include <QMutex>
class Worker : public QObject
{
Q_OBJECT
public:
explicit Worker(QObject *parent = nullptr) : QObject(parent) {}
public slots:
void doWork()
{
static QMutex mutex; // 创建静态互斥锁
for (int i = 1; i <= 15; ++i)
{
mutex.lock(); // 加锁
qDebug() << i; // 打印输出
QThread::msleep(100); // 模拟一些耗时操作
mutex.unlock(); // 解锁
}
}
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QThread thread1;
Worker worker1;
worker1.moveToThread(&thread1);
QObject::connect(&thread1, &QThread::started, &worker1, &Worker::doWork);
thread1.start();
QThread thread2;
Worker worker2;
worker2.moveToThread(&thread2);
QObject::connect(&thread2, &QThread::started, &worker2, &Worker::doWork);
thread2.start();
return a.exec();
}
```
在上述修改后的代码中,我们创建了一个静态的 QMutex 对象,并在 doWork 槽函数中使用互斥锁来保护对标准输出流的访问。只有一个线程可以获得互斥锁并进行输出操作,其他线程在互斥锁被释放之前将被阻塞。
通过使用互斥锁,你可以确保输出内容按照预期顺序打印,避免了输出内容的交错和不完整。
阅读全文