Published on

Boost.Thread - thread group

Authors

Boost.Thread で複数のスレッドを同時に扱う場合には,下記のように thread_group を使います.

#include <boost/thread.hpp>

void print_and_sleep()
{
  std::cout << "Hello world!" << std::endl;
  boost::this_thread::sleep(boost::posix_time::milliseconds(3000));
}

int main() {

  boost::thread_group tg;
  for (int i = 0; i < 3; i++) {
      tg.create_thread(print_and_sleep);
  }
  tg.join_all();

  return 0;
}

上記のもので全く問題はないんですが,C++11 には thread_group が存在しないそうです.そこで大した作業ではないのですが移植性・互換性を考え C++11 と同様に vector を使って thread group を実装します.

thread は noncopyable なクラスなのでコピーできません.move を使って実装しようと思ったのですが,VC2008 でコンパイルできなかったので shared_ptr に入れて使いまわしています.

#include <boost/smart_ptr/make_shared.hpp>
#include <boost/thread.hpp>

void print_and_sleep()
{
    std::cout << "Hello world!" << std::endl;
    boost::this_thread::sleep(boost::posix_time::milliseconds(3000));
}

void do_join(boost::shared_ptr<boost::thread>& t)
{
    t->join();
}

void join_all(std::vector<boost::shared_ptr<boost::thread> >& vec)
{
    std::for_each(vec.begin(), vec.end(), do_join);
}

int main() {

  typedef std::vector<boost::shared_ptr<boost::thread> > thread_vector;

  thread_vector tv(3);
  for (int i = 0; i < 3; i++) {
      tv[i] = boost::make_shared<boost::thread>(print_and_sleep);
  }
  join_all(tv);

  return 0;
}

Reference:

http://www.justsoftwaresolutions.co.uk/threading/managing_threads_with_a_vector.html