次の2つを混ぜます。

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で動くことを確認しました。

スポンサード リンク

この記事のカテゴリ

  • ⇒ Boost.ThreadとBoost.Optional