论文N3784中std::future::then
的接口包含一个重载版本,它接受执行程序(在N3562中更详细地描述)作为参数。因此,如果您想要更多地控制执行回调的线程,您可以这样做。
但是,覆盖此处http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0159r0.html#futures.unique_future并发TS中所有功能的官方文档不包括.then()的重载,并且根本没有提及执行程序。它说
当对象的共享状态准备就绪时,在未指定的执行线程上调用继续
INVOKE(DECAY_COPY(std::forward<F>(func))
,std::move(*this))
,并在调用的线程中调用DECAY_COPY()
。
为什么界面不能精确控制闭包的执行方式?那么如何控制哪个线程运行回调呢?为什么要改变建议的版本?
注意我不确定我链接的并发TS文件是否是最新版本,但cppreference没有在任何地方提及executor
编辑如果某人在某些C ++标准文件中有参考或理由提及不继续执行者的原因,那就太棒了!
答案 0 :(得分:2)
为什么要改变建议的版本?
TSes是试验气球,用于接近标准化的功能,但可能尚未达到最终形式。它们是标准委员会获得经验的机会,可以看到在现实世界中哪些有效,哪些无效。
由于至少有一个newer proposal for executors,工作组似乎对执行人员不满意,因为他们在TS中并且在标准化之前对它们进行了精炼。
如何控制哪个线程运行回调?
现在,您似乎必须依赖语言或图书馆扩展或自己推广。我没有研究过这个提议,如果提案成为标准的一部分,你会怎么做,但它看起来像then_execute
,它可以是一个自由函数,也可以是执行者对象的成员,关键。