Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std::async()似乎并没有真正实现单线程异步行为?_C++_Asynchronous - Fatal编程技术网

C++ std::async()似乎并没有真正实现单线程异步行为?

C++ std::async()似乎并没有真正实现单线程异步行为?,c++,asynchronous,C++,Asynchronous,上下文:我在研究异步编程的实际工作原理。在对该主题进行了一些调查之后,得出的结论是有两件事需要区分: 并发(同步/异步):关于任务 多线程:关于工人 基于这些概念,我们可以确定4种主要的任务并行化方法。我画了一张100多字的图来说明这一点: 注意:这里不考虑第4列(多线程异步),因为它混合了多线程和异步编程 在中,我们有一个模板函数,允许我们异步运行函数 我们可以设置为: std::launch::async:在单独的线程中“异步”运行 std::launch::deferred:请求结

上下文:我在研究异步编程的实际工作原理。在对该主题进行了一些调查之后,得出的结论是有两件事需要区分:

  • 并发(同步/异步):关于任务
  • 多线程:关于工人
基于这些概念,我们可以确定4种主要的任务并行化方法。我画了一张100多字的图来说明这一点:

注意:这里不考虑第4列(多线程异步),因为它混合了多线程和异步编程

在中,我们有一个模板函数,允许我们异步运行函数

我们可以设置为:

  • std::launch::async
    :在单独的线程中“异步”运行
  • std::launch::deferred
    :请求结果时运行
问题:如果我们看一下我的绘图,
std::launch::async
策略似乎表现为多线程同步,而
std::launch::deferred
策略似乎表现为单线程异步的孤立情况(当请求结果时,函数是一次性执行的)

但是,如果我没有弄错的话,单线程异步背后的想法是,在等待资源可用或遇到延迟(磁盘访问时间,…)时,程序不应该一直阻塞主线程(从而浪费时间),而是继续执行下一个任务(稍后再返回上一个任务)

我不明白的是,
std::async()
似乎不允许这种行为。我们只能在另一个线程中同步运行任务,或者在请求结果时(尽可能晚)一次性运行任务

如果我们看一下我的绘图,单线程异步方法并没有真正实现,因为函数在“oneshot”中运行,无论它是否必须等待资源。因此,在这种情况下,我们仍将浪费时间

我想知道为什么?我的理解错了吗?这是在
std::async()
实现中的疏忽还是故意的(按标准)



Edit:我不确定这是否是问这个问题的正确地方,因为这不是一个真正的“编码”问题。

为什么你认为
std::async
实现了“单线程异步”模式?我在理解多线程同步和单线程异步之间的区别时遇到了一个问题。在这两种情况下,每个任务都需要自己的堆栈。所以它基本上是三条独立的线。然后将差异缩小到线程调度程序。也许您正在寻找?@AlanBirtles,因为我假设
std::async()
是用于异步运行任务的,我称之为单线程异步模式是异步操作的重复说明。我知道有几种类型的异步(
std::async()
似乎实现了其中的两种),但我在问题中提到这种模式的动机是。我想知道是否有一个具体的原因没有实施它。但事实上,也许我通过异步寻找的是现实中的协同路由。感谢您的通知:)在本例中,aysnchronous仅表示“不同步”,如“非阻塞”或“不要等到执行”,它不适用任何进一步的含义。可以在未来的标准中添加额外的启动策略,或者作为供应商扩展来提供额外的语义