Boost.Threadのfutureには、どれが一つが完了するまで待つwait_for_anyと、全て完了するまで待つwait_for_allがあるようです。
これはN3242時点のC++0xにはない機能。
#define BOOST_NO_RVALUE_REFERENCES #include <shand/async.hpp> #include <boost/detail/lightweight_test.hpp> int make_int() { return 3; } int make_int_slowly() { boost::this_thread::sleep(boost::posix_time::seconds(1)); return 4; } int main() { boost::shared_future<int> f1 = shand::async(make_int); boost::shared_future<int> f2 = shand::async(make_int_slowly); boost::wait_for_any(f1, f2); BOOST_TEST(f1.is_ready()); BOOST_TEST(!f2.is_ready()); BOOST_TEST(f1.get() == 3); BOOST_TEST(f2.get() == 4); return boost::report_errors(); }
#define BOOST_NO_RVALUE_REFERENCES #include <shand/async.hpp> #include <boost/detail/lightweight_test.hpp> int make_int() { return 3; } int make_int_slowly() { boost::this_thread::sleep(boost::posix_time::seconds(1)); return 4; } int main() { boost::shared_future<int> f1 = shand::async(make_int); boost::shared_future<int> f2 = shand::async(make_int_slowly); boost::wait_for_all(f1, f2); BOOST_TEST(f1.is_ready()); BOOST_TEST(f2.is_ready()); BOOST_TEST(f1.get() == 3); BOOST_TEST(f2.get() == 4); return boost::report_errors(); }
ここで使用しているshand::asyncは、以下の実装を持ってきたものです。
C++03 + boost で C++0x の async - ろじかるんるんものがたり
参照: