使用QString进行多线程处理

时间:2016-09-06 13:16:12

标签: c++ multithreading qt

我正在接近多线程世界。 我有一个关于QString和多线程应用程序的问题。

我的主要应用类是:

MyGeneralClass{
    public:
    std::vector< QString > hpg_lines;
    .
    .
    .

};

我的多线程课程看起来像这样:

class MyTread:public QThread{
    private:
    QString qstr_;
    MyGeneralClass *gen_;
    .
    .
};

每个线程在其qstr对象中写入一些内容(大量的字符串),并在线程的末尾将其复制到主类的向量hpg_lines上。 我可以这样做,还是我可以在一些数据中丢失? 谢谢你的帮助

3 个答案:

答案 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