C++26 中的新异步模型与现有模型有何不同?

问题描述 投票:0回答:2

我一直在阅读 https://eel.is/c++draft/exec 的部分内容以及有关此主题的其他相关文章。我知道什么是调度程序、接收方和发送方。但是,我不明白这些交互如何为 C++ 中的异步编程创建这样一个新模型。

我很好奇它们与其他模型(例如原始

std::future
std::promise
、执行器和 Boost 的 ASIO)有何不同?

c++ asynchronous c++26
2个回答
8
投票

我很好奇它们与其他模型(例如原始

std::future
std::promise
、执行器和 Boost 的 ASIO)有何不同?

不确定你所说的“执行者”是什么意思,如果不是你提到的提案,我也不知道Boost ASIO,但关于如何P2300(基于你提到的草案那部分的提案)与

std::future
std::promise
相关,区别恰恰在于这两个是 Eric Niebler 所说的“非结构化并发”的非常低级别的构建块。有了这些构建块,作为程序员,在管理生命周期(例如状态、回调等)方面,很多的责任就落在了你身上。

P2300结构化并发的基础,旨在提供构建块,使您摆脱(某些?)这些责任。为了澄清这一点,埃里克·尼伯勒 (Eric Niebler) 做了一个类比

  • 非结构化编程(仅
    goto
    用于控制流)与结构化编程(使用
    for
    /
    while
    /
    if
    用于控制流),
  • 非结构化并发
    std::future
    std::promise
    std::mutex
    ,...)与结构化并发
    when_all
    when_any
    以及P2300中提出的其他抽象,以及协程) .

然而,这是一个非常广泛的话题,老实说,我无法彻底回答这些问题(如果可以的话,我可能会更关心如何花掉我每年的 50 万英镑,而不是在这里度过时间) ,但我认为您可以在这 3 场演讲(以及上面的链接)中找到您问题的大部分答案:

Eric Niebler(以及第一个视频 Daisy Hollman)将涵盖该主题的足够内容。不过,这里的答案太多了。另外,我并没有理解它的每一个细节:D


3
投票

Eric 在本次演讲中对此进行了解释 https://youtu.be/h-ExnuD6jms?t=525

基本上 std::experimental::future::then 缓慢且破碎。

std::promise
/
std::future
分配,您必须为此分配进行引用计数。

std::promise::set_value之间存在竞争条件 和future::then

。为了避免竞争条件,您需要 
std::mutex
std::condition_variable

在创建

future

/
promise
时,您不知道延续/可调用的类型。它必须被类型擦除,即 
std::function
 具有另一个分配,并且可能通过函数指针进行间接寻址。总而言之,一两次分配、一次间接函数调用、锁定、引用计数。这分量真的好重啊

发送方和接收方在编译时完成所有这些操作,从而使

std::execution::then

 能够免锁和分配。

© www.soinside.com 2019 - 2024. All rights reserved.