1

我一直在玩弄 Boost 的未来,想知道它们是否是一种可接受且安全的方式来检查单个线程是否已完成。

我以前从未使用过它们,所以我编写的大部分代码都是基于Boost 的同步文档

#include <iostream>
#include <boost/thread.hpp>
#include <boost/thread/future.hpp>

int calculate_the_answer_to_life_the_universe_and_everything()
{
    boost::this_thread::sleep(boost::posix_time::seconds(10));
    return 42;
}

int main()
{
    boost::packaged_task<int> task(calculate_the_answer_to_life_the_universe_and_everything);
    boost::unique_future<int> f(task.get_future());

    boost::thread th(boost::move(task));

    while(!f.is_ready())
    {
        std::cout << "waiting!" << std::endl;
        boost::this_thread::sleep(boost::posix_time::seconds(1));
    }

    std::cout << f.get() << std::endl;

    th.join();
}

这似乎在等待 calculate_the_answer_to_life_the_universe_and_everything() 线程返回 42。这可能会出现问题吗?

谢谢!

4

2 回答 2

4

是的,future 以这种方式使用是安全的,并且代码(一目了然)安全且正确。

还有其他方法可以做同样的事情(例如,使用atomic_flag,或互斥保护数据,或许多其他方法),但您的代码是一种有效的方法。

NB 而不是f.is_ready()andthis_thread::sleep(seconds(1))你可以使用f.wait_for(seconds(1)),一旦结果准备好就会唤醒。直接等待未来,而不是检查未来,然后使用单独的机制等待,然后检查,然后使用单独的机制等。

而不是packaged_taskandthread你可以使用async.

使用 C++11 名称而不是 boost ...

int main()
{
    auto f =  std::async(std::launch::async, calculate_the_answer_to_life_the_universe_and_everything);

    while(f.wait_for(std::chrono::seconds(1)) == std::future_status::timeout)
        std::cout << "waiting!" << std::endl;

    std::cout << f.get() << std::endl;
}
于 2012-08-23T00:56:17.650 回答
2

我一直在玩弄 Boost 的未来,想知道它们是否是一种可接受且安全的方式来检查单个线程是否已完成。

Futures 是一种异步评估机制,而不是同步机制。尽管某些原语确实具有同步属性 ( future<>::get),但该库并非旨在同步,而是触发任务并在需要结果之前忽略它。

于 2012-08-23T00:29:56.550 回答