しるふぃずむ

どうもプログラマです。好きなものはC#とジンギスカンです。嫌いなものはJava。プログラムおもちろいね。

std::thread::joinが返らない

シングルトンオブジェクト.
裏で回したスレッドに色々やらせて,プログラム終了時に止めて残った処理をさせたいんですが
"end loop"の表示が出てthread_loop()は終了してる様子なのにjoinが返ってきません.
何か勘違いでしょうか.詰まったのでとりあえずメモ.

2012/8/23 追記

解決しました
VS2012RC

#include <iostream>
#include <memory>
#include <thread>
#include <chrono>

class Foo
{
public:
	/** 初期化 */
	static void initialize(){
		std::cout << "init" << std::endl;
		inst_.reset(new Foo());

		inst_->thread_ = std::thread(thread_loop);
	}

	~Foo()
	{
		std::cout << "dtor" << std::endl;
		end_flag_ = false;
		thread_.join();	//ここで停止
			
		//後処理
		std::cout << "dtor end" << std::endl;
	}

private:
	Foo(): interval_(100), end_flag_(true){}
	Foo(const Foo&);
	Foo(Foo&&);
	Foo& operator=(const Foo&);
	Foo& operator=(Foo&&);

	static void thread_loop();

	static std::unique_ptr<Foo> inst_;

	std::thread thread_;
	std::chrono::milliseconds interval_;
	bool end_flag_;
};

std::unique_ptr<Foo> Foo::inst_;

void Foo::thread_loop()
{
	while(inst_->end_flag_)
	{
		std::cout << "loop..." << std::endl;
		//メイン処理

		std::this_thread::sleep_for(inst_->interval_);
	}
	std::cout << "end loop" << std::endl;
}

int main(int argc, char* argv[])
{
	Foo::initialize();
	std::cout << "wait.." << std::endl;
	std::this_thread::sleep_for(std::chrono::seconds(1));

	std::cout << "Exit" << std::endl;
}

出力

init
loop...
wait..
loop...
loop...
loop...
loop...
loop...
loop...
loop...
loop...
loop...
Exit
dtor
end loop