- Published on
Boost.Thread - thread group
- Authors
- Name
- Daisuke Kobayashi
- https://twitter.com
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