次の2つを混ぜます。
- std::threadをあとから開始。それとムーブ対応したコンテナについて – Faith and Brave – C++で遊ぼう
- Boost.Optional と Boost.InPlaceFactory で初期化遅延 – 銀天随筆集
Boost.Optionalで初期化を遅らせる技法をBoost.Thread(コンストラクトするとスレッドが動き出す)と組み合わせるとどうなるか、任意のタイミングで実行を開始できるようになるというわけです。
そんなわけで、Akiraさんの「std::threadをあとから開始。それとムーブ対応したコンテナについて」の記事の冒頭のコードをBoost.OptionalとIn place facotryで書き直したものがこちらです。
#include <iostream> #include <boost/optional.hpp> #include <boost/utility/in_place_factory.hpp> #include <boost/thread.hpp> class X { boost::optional<boost::thread> thread_; void do_() { std::cout << "do" << std::endl; } public: ~X() { if (thread_) thread_->join(); } // あとで実行(boost::in_placeでthreadを作る) void start() { thread_ = boost::in_place([this] { do_(); }); } }; int main() { X x; x.start(); } |
このコードは、Visual C++ 2010で動くことを確認しました。
スポンサード リンク |
この記事のカテゴリ
- C++ ⇒ Boost.ThreadとBoost.Optional