我想知道将其他对象传递给在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对象怎么办?
答案 0 :(得分:1)
通常来说,只要将某种对象读写到对象上,并确保有某种机制可以处理并发问题,将对象传递给不同的线程就不会有错误。最简单的方法是使用条件变量/互斥量,该条件变量/互斥量会在使用对象时获取(锁定)该对象。其他线程将等待,直到不再使用该锁,以便它们可以保留它。
您编写的代码无法正常工作。 “ example”是一个局部变量,在函数返回时将被删除。您需要确保变量的生存期始终超出其使用范围。您可能希望线程持有指向动态分配对象的智能指针,例如 std :: shared_ptr 。