我的 Qt4 代码使用了一些 QThread 实例,这些实例对包含一些 QString 字段的公共数据结构进行操作。它可以归结为以下几点:
我的数据结构:
class My : public QObject{
Q_OBJECT
public:
QString foo;
};
线程实现:
class Thr : public QThread{
public:
My* my;
protected:
void run(){
while (true){
QString copy = my->foo;
QString bar = copy.toUpper();
my->foo = bar.toLower();
}
}
};
这是为我研究该问题而编写的测试应用程序。当然,它并没有做任何实际有用的事情:)
如果我初始化一个实例My
并使用该实例启动一个线程,那么一切都很好。但是,当我使用相同的实例启动第二个时My
,它会崩溃并显示不同的消息,看起来像是一些堆/堆栈/任何损坏。
这正常吗?我知道一般的多线程问题以及Qt的QMutex,它可以避免这个问题。但就我正确理解 Qt 文档而言,我被允许以这种方式使用它。我不会同时对 QString 的同一个实例进行操作(可能是因为一些花哨的隐式共享机制 - 但文档指出这对用户来说是完全透明的?!)。
如前所述,我的问题不是关于如何重写代码,而是关于“从 Qt 4 开始,隐式共享类可以安全地跨线程复制,就像任何其他值类一样。它们是完全可重入的。隐式共享真的是隐含的。” (http://qt-project.org/doc/qt-4.8/threads-modules.html)我误解了。