0

このコードの何が問題なのか知りたいです。時々私はセグメンテーション障害を起こしますが、そうでないこともあります。これは私がより大きなソフトウェアで抱えている問題です。アイデアは、同時に1つのスレッドだけがメソッド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"));
    }

}
4

1 に答える 1

5

forスレッドを生成するサイクルの後で、スレッドに参加することはありません。

したがって、main()すべてのスレッドが終了する前に関数が終了する場合があります。これによりスコープが外れ、スレッドは破棄されたオブジェクト(特にその変数)myClにアクセスしようとします。mutexこれはあなたに未定義の振る舞いを与えます。

終了する前にスレッドに参加した場合(または、いずれかのスレッドがまだ実行されている限り、main()終了しない他の方法を見つけた場合)、状況は改善されるはずです。main()

于 2013-02-19T18:00:58.010 に答える