我想知道这段代码有什么问题。有时我会出现固立错误,有时不会。这是我在更大的软件中遇到的一个问题,它的想法是同时只有一个线程在执行方法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和互斥锁的非常简单的方法有时会给出段错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14963914/

10-13 07:58