私のアプリケーション用のスレッドプールが必要なので、std::map<int, std::thread>
オブジェクトを作成できました。私はこのように単純化することができますいくつかの非常に予期しない動作、遭遇した :std :: threadを使用してstd :: threadを使用すると予期しない動作が発生する
std::map<int, std::thread> threads;
threads.insert(std::pair<int, std::thread>(1, std::thread([]() {
std::cout << "I'm the first thread and I'm gonna work\n";
})));
threads[1].join();
std::cout << "Thread 1 joinable? " << threads[1].joinable() << "\n";
threads.insert(std::pair<int, std::thread>(1, std::thread([]() {
std::cout << "I'm not gonna work at all\n";
})));
threads[1].join();
に出力が
I'm the first thread and I'm gonna work
Thread 1 joinable? 0
右後、std::terminate()
が呼び出され、プログラムがSIGABRTシグナルを受信しています。
ライブデバッグでは、joinable()
がtrueであるため、terminate
が呼び出されていることが示唆されましたが、私はそれをチェックしていませんでした。
また、それを克服する方法はjoin()
INGの後に次の行を追加するだけだった。
threads.erase(1);
std::thread
の新しいインスタンスがちょうど私の前に作成されたように見えるよう、少し混乱私の葉insert
コール...誰かがこの予期しない動作について私にヒントを与えることができますか? http://en.cppreference.com/w/cpp/container/map/insertから
stdoutでトレースするときは、フラッシュするのを忘れないでください。 – molbdnilo
@molbdnilo - 改行はそうするべきです。 –
@OliverCharlesworth ''\ n''は' std :: cout'をフラッシュしません。 –