vector
がthread
のC++プログラムです。スレッド完了時にスレッドからベクトルを削除する
std::vector<std::thread> threadList;
次に、スレッドを作成してvector
にプッシュします。私はthreadList
vector
ときlambda function終了の実行からthread
を削除するにはどうすればよい
threadList.push_back(std::thread([]() { ... }));
?
編集
私は多少の溶液を作ってみました。スレッドlambda functionが返される前に、vector
を繰り返してIDの一致をthis_thread::get_id()
にします。
Visual Studioで1行ずつデバッグすると、一致するものが見つかってerase関数が実行されますが、threadList.erase(threadList.begin() + index);
が実行されるとすぐにスレッドのdeconstructor関数で処理されない例外が発生します。
私はこのエラーを複製する小さなコードを書いています。
vector<thread> threadList;
threadList.push_back(thread([]() {
Sleep(1000);
threadList.erase(threadList.begin());
}));
Sleep(2000);
//for_each(threadList.begin(), threadList.end(), mem_fn(&thread::detach));
//threadList.clear();
このコードの結果、次のスクリーンショットが表示されます。
ラムダは、ベクトルから 'std :: thread'を取り除くことができます(これは、' std :: mutex'などのように 'ベクトル'を並行アクセスから保護することを意味します)。あるいは、ラムダが何らかの方法で 'vector'を所有するスレッドにシグナルを送るようにして、そうする時間があるときにそのスレッドが' std :: thread'を取り除かせるようにすることができます。あるいは、所有するスレッド(または別の監視スレッド)に 'std :: thread'を単に' join() 'させ、終了時に削除することができます。 –
'join()'スレッドを最初に実行してから、それをベクトルから完全に100%同一の方法で削除します。他のベクトルから何かを削除します。ベクトルは、 'std :: thread'を含んでいるからといって、その値を追加したり削除したりするという点で、動作が異なっていません。 –
std :: vector :: erase() – Les