为什么boost :: future <T> :: then()会产生一个新线程?

mar*_*n78 8 c++ multithreading boost c++11

附加延续时boost::future,继续在新线程中执行:

std::cout << "main: " << boost::this_thread::get_id() << std::endl;

boost::promise<void> p;
boost::future<void> f = p.get_future();
p.set_value();

boost::future<void> f2 = f.then([] (boost::future<void>) {
    std::cout << "future: " << boost::this_thread::get_id() << std::endl;        
});
Run Code Online (Sandbox Code Playgroud)

此代码段输出:

main: 0x7fff7a8d7310
future: 0x101781000
Run Code Online (Sandbox Code Playgroud)

为什么.then()允许这样做,更重要的是,有没有办法来定制这种行为?不要future从返回S ^ promise/ packaged_task/ async不同的表现?

Ale*_*iuk 5

在@ikh 的回答中已经提到了。但为了更清楚,这里是 OP 问题的直接答案。

是否boost::future应在新线程或调用线程中执行延续是可定制的。

boost::launchpolicy 参数指定延续应该如何运行。请参阅此处:枚举启动

enum class launch
{
    none = unspecified,
    async = unspecified,
    deferred = unspecified,
    executor = unspecified,
    inherit = unspecified,
    any = async | deferred
};
Run Code Online (Sandbox Code Playgroud)

由启动策略创建async(launch::deferred, ...)::then(launch::deferred, ...)与启动策略相关联的未来launch::deferred

所以,尝试运行这个:

boost::future<void> f2 = f.then(
    boost::launch::deferred,
    [] (boost::future<void>&&) {
        std::cout << "future: " << boost::this_thread::get_id() << std::endl;        
    }
);
Run Code Online (Sandbox Code Playgroud)

那应该在同一个线程中运行延续。
在 Windows 平台上使用 boost 1.61 + Visual Studio 2015 进行测试。