将对象传递给多线程对象Qt

时间:2018-10-02 18:20:27

标签: c++ multithreading qt c++11

我想知道将其他对象传递给在GUI线程以外的其他线程中运行的对象是否是线程安全的。 我的意思是这样做是线程安全的吗? 在应用程序的整个生命周期中,此示例对象发生了什么?

在worker.h文件中

private:
Example* example;

在worker.c文件中

Worker::Worker(QObject *parent, Example *example) :
QObject(parent),
example(example)
{

}

在main.c

Example example(nullptr);
auto worker = new Worker(nullptr, &example);
auto thread = new QThread;
Printer printer;

QObject::connect(thread, &QThread::started, worker, &Worker::doWork);
QObject::connect(worker, &Worker::readedText, &printer, &Printer::printMessage);
QObject::connect(worker, &Worker::workDone, thread, &QThread::quit);
QObject::connect(thread, &QThread::finished, worker, &Worker::deleteLater);

worker->moveToThread(thread);
thread->start();

既然我将指针传递给该对象,那么如果GUI线程不得不使用Example对象怎么办?

1 个答案:

答案 0 :(得分:1)

通常来说,只要将某种对象读写到对象上,并确保有某种机制可以处理并发问题,将对象传递给不同的线程就不会有错误。最简单的方法是使用条件变量/互斥量,该条件变量/互斥量会在使用对象时获取(锁定)该对象。其他线程将等待,直到不再使用该锁,以便它们可以保留它。

您编写的代码无法正常工作。 “ example”是一个局部变量,在函数返回时将被删除。您需要确保变量的生存期始终超出其使用范围。您可能希望线程持有指向动态分配对象的智能指针,例如 std :: shared_ptr