1

なぜこれが 4 回に 1 回の実行でクラッシュするのか興味があります。

スレッド ID を含む文字列を返す単純なクラスがあります。このクラスは、別のクラス内からラムダで非同期に呼び出され、結果を返します。コードは私ができる限り単純です - 私はまだ学んでいます:

class String_Returner
{
public:
    string run() const
    {
        return "I returned from thread "+to_string(this_thread::get_id());
    }
};

class Class_Holder
{
public:
    Class_Holder() : number_of_runs(10)
    {
        srs.resize(number_of_runs);
    }

    void concurrent_srs()
    {
        for (int i = 0; i < number_of_runs; i++)
        {
            results.push_back(async([&]{return srs[i].run();}));
        }

        for (int i = 0; i < results.size(); i++)
        {
            cout << i << ") " << results[i].get() << endl;
        }

        results.clear();
    }
private:
    vector<future<string>> results;
    vector<String_Returner> srs;
    const int number_of_runs;
};

void class_b_test()
{
    Class_Holder ch;
    ch.concurrent_srs();
}

参照で async を使用するのは危険だと認識していますが、何も書き込まれていない場合は安全だと考えました。私のエラーはおそらくラムダ自体に起因すると思います。これは主に async とラムダの機能をテストするためのプログラムです。

私の主な質問: 1) なぜクラッシュするのですか? 2)これを行うためのより良い方法は何ですか?

4

2 に答える 2