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
不同的表现?
在@ikh 的回答中已经提到了。但为了更清楚,这里是 OP 问题的直接答案。
是否boost::future
应在新线程或调用线程中执行延续是可定制的。
boost::launch
policy 参数指定延续应该如何运行。请参阅此处:枚举启动
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 进行测试。
归档时间: |
|
查看次数: |
1877 次 |
最近记录: |