Boost.Thread wait_for_anyとwait_for_all

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 - ろじかるんるんものがたり


参照:

boost::wait_for_any

boost::wait_for_all