使用QtConcurrentRun和互斥锁的非常简单的方法有时会产生分段错误

时间:2013-02-19 17:39:08

标签: 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"));
    }

}

1 个答案:

答案 0 :(得分:5)

在生成for周期后,您不会加入线程。

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

如果你在退出main()之前加入你的线程,或者在任何线程仍在运行的情况下找到任何其他不退出main()的方式,事情应该会变得更好。