c++ - 使用 QtConcurrentRun 和 mutex 的非常简单的方法有时会出现段错误

标签 c++ qt thread-safety

我想知道这段代码有什么问题。有时我会遇到故障,有时不会。这是我在一个更大的软件中遇到的问题,想法是同时只有一个线程正在执行方法 MyClass::print。即使是这个简单的例子,它也会因段错误而失败。代码有什么问题?我该如何解决这个问题?

谢谢!

#include <iostream>
#include <ctime>
#include <QMutex>
#include <QtConcurrentRun>

class MyClass : QThread {
public:
    void print(std::string str) {
        mutex.lock();
        std::cout << "In some thread: " <<  str << "\n";
        mutex.unlock();
    }

private:
    QMutex mutex;

};

int main() {

    MyClass myCl;

    for(int i=0; i < 10; i++) {
        QtConcurrent::run(&myCl, &MyClass::print,std::string("bla"));
    }

}

最佳答案

在生成它们的 for 循环之后,您不会加入您的线程。

因此,main() 函数可能会在所有线程完成之前结束。这将使 myCl 超出范围,并且线程将尝试访问已被销毁的对象(特别是其 mutex 变量)。这给你未定义的行为

如果你在退出 main() 之前加入你的线程(或者找到任何其他不退出 main() 的方法,只要任何一个线程仍在运行)。

关于c++ - 使用 QtConcurrentRun 和 mutex 的非常简单的方法有时会出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14963914/

相关文章:

c++ - Qt如何选择默认样式?

qt - QML 中的自定义附加属性

c++ - Qt3D 围绕网格旋转相机

c++ - 如何搜索和打印字符串中的特定部分?

c++ - 在OpenGL中实现边界球碰撞

java和线程: very strange behaviour

java - 将类从线程不安全迁移到线程安全

java - 在构造函数之外初始化的最终字段是否会在运行构造函数之前初始化?

c++ - 如何访问RTCVideoRenderer的帧? (ios)

c++ - 这段代码是字节序安全的吗?