我正在接近多线程世界。 我有一个关于QString和多线程应用程序的问题。
我的主要应用类是:
MyGeneralClass{
public:
std::vector< QString > hpg_lines;
.
.
.
};
我的多线程课程看起来像这样:
class MyTread:public QThread{
private:
QString qstr_;
MyGeneralClass *gen_;
.
.
};
每个线程在其qstr对象中写入一些内容(大量的字符串),并在线程的末尾将其复制到主类的向量hpg_lines上。 我可以这样做,还是我可以在一些数据中丢失? 谢谢你的帮助
答案 0 :(得分:0)
据我所知,std :: vector不是线程安全的(用于读写)。由于您需要对共享数据结构进行精确访问,因此最简单易用的解决方案应该是http://doc.qt.io/qt-5/qmutex.html。声明一个新的互斥锁,然后使用:
your_mutex.lock();
do your stuff on the data structure;
your_mutex.unlock();
确保your_mutex也是线程之间的相同资源,而不是每个线程都有一个互斥锁。这意味着互斥量应该是glboal变量或传递给每个线程。
答案 1 :(得分:0)
最安全的方法是将结果传递给控制线程,并且该线程可以将结果复制到向量。这样,不会从多个线程访问向量。在Qt中,这可以通过queued connection完成。
答案 2 :(得分:0)
当你要将字符串写入qstr并添加到vector hpg_lines时,请使用mutex.lock()和mutex.unlock()函数; (互斥体是Qmutex类的对象)
例如
mutex.lock()
write string to qstr;
add qstr to hpg_lines;
mutex.unlock();
这样就不允许其他线程修改qstr或hpg_lines;
由于 Sajeesh