基本的なオペレーティングシステムスレッドは終了している可能性がありますが、C++ std::thread
オブジェクトが破棄されるスレッドと同じではありません。
次のコマンドを実行します。
#include <iostream>
#include <thread>
#include <mutex>
#include <atomic>
std::mutex cout_mutex;
std::atomic<bool> waiter{true};
void func(){
{
std::lock_guard<std::mutex> guard(cout_mutex);
std::cout << "funky\n";
}
while(waiter);//cheap spin waiting...
}
int main() {
auto threadPtr = std::make_shared<std::thread>(func);
{
std::lock_guard<std::mutex> guard(cout_mutex);
std::cout << "an active thread id: "<<threadPtr->get_id()<<'\n';
}
waiter=false;
threadPtr->join();
std::cout << "terminated thread id: "<< threadPtr->get_id()<<'\n';
return 0;
}
出力は、ここで可能な出力に過ぎ変わるがある:
an active thread id: 47441922455296
funky
terminated thread id: thread::id of a non-executing thread
threadptr
に含まれるオブジェクトが破壊されるまで有効なままですが、終了したスレッドを参照することができます。
std::thread
は、通常、ラッパークラス(またはプロキシデザインパターン)の実装です。通常、オペレーティングシステムのスレッドオブジェクトとは何か(おそらく空の)参照を含みます。ラップされたスレッドが終了すると、参照が空になることがあります。
スレッドインスタンスを共有するコードは他にありません。したがって、単純にスタックに割り当てられている場合は同じになります。 –
なぜスレッドオブジェクトが破壊されたと思いますか? – NathanOliver
'threadPtr'は、他のスタック変数と同じようにmainを離れるときに破壊されます。 – stark