为什么执行器不再包含在并发 TS 和 std::future 接口中?

5

在论文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 也没有在任何地方提到执行器。
编辑:如果有人有一个关于不继续使用执行器的 C++ 标准文件的参考或原因,那就太好了!

3
@Xirema 你为什么这么说?如果标准委员会认为在大多数编程用例中使用执行器是不好的设计,那么了解他们为什么这样认为是很有益的。 - Curious
2
@Xirema:“因为这个网站的主要目的是调试代码。”不,调试代码并不是主要目的。(事实上,在几年前我们失去了“过于局部化”的关闭理由之前,调试问题曾经被反对,现在只有在符合某些限制条件的情况下才会勉强接受。)这个网站的目的是提出和回答编程问题,以建立一个知识库,帮助未来的用户。 - Adrian McCarthy
2
如果我没记错,执行器的设计相当有争议,因此它们被拿出来,直到人们达成一致意见。否则,其余的并发 TS 将会被阻塞。 - T.C.
1
@Curious 那么你的问题表述得不够清晰。如果问题只是“我该如何做这个事情”,那么你需要展示一些代码,说明你尝试了如何去做,以及它为什么不能达到你预期的效果。其他所有的东西(比如“执行器为什么从规范中被移除了?”)都是无关紧要的,并且应该在另一个网站上发布自己的问题。 - Xirema
1
请参见N4032N4046 - T.C.
显示剩余21条评论
1个回答

2
为什么要更改原始版本?
TSes是接近标准化的功能的试验性版本,但可能还不是最终形式。它们是标准委员会获得实际经验以查看在现实世界中哪些工作和哪些不工作的机会。
由于至少有一个更新的执行器提案,似乎工作组对TS中的执行器不满意,并在标准化之前对其进行了改进。
那么如何控制哪个线程运行回调函数呢?
目前,似乎您需要依赖语言或库扩展或自己编写。我还没有详细研究该提案,无法说如果该提案成为标准,您将如何做到这一点,但看起来可以是then_execute,它可以是自由函数或执行器对象的成员。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接