问题标签 [stdasync]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1316 浏览

c++ - std::async - 依赖于实现的用法?

我一直在思考std::async以及应该如何在未来的编译器实现中使用它。然而,现在我有点被一些感觉像是设计缺陷的东西困住了。

std::async几乎取决于实现,可能有两种变体launch::async,一种将任务启动到新线程中,另一种使用线程池/任务调度程序。

但是,根据用于实现的这些变体中的哪一个,std::async用法会有很大差异。

对于基于“线程池”的变体,您将能够启动许多小任务而不必担心开销,但是,如果其中一个任务在某个时候阻塞怎么办?

另一方面,“启动新线程”变体不会遇到阻塞任务的问题,另一方面,启动和执行任务的开销会非常高。

线程池: +低开销,-从不阻塞

启动新线程: +fine with blocks,-high开销

所以基本上取决于实现,我们使用的方式std::async会非常谨慎。如果我们有一个程序可以很好地与一个编译器一起工作,那么它可能会在另一个编译器上运行得非常糟糕。

这是设计使然吗?还是我错过了什么?你会像我一样认为这是一个大问题吗?

在当前规范中,我缺少类似的东西std::oversubscribe(bool),以便实现独立于std::async.

编辑:据我所知,C++11 标准文档没有给出关于发送到的任务是否std::async阻塞的任何提示。

0 投票
5 回答
8110 浏览

c++ - c++11 std::async 在 mingw 中不起作用

从 Herb Sutter 的演示文稿中运行此代码。这在 gcc 4.6.3 下的 linux 中运行良好。我在想mingw不支持future.h,但是这个错误真的很难理解!

这是错误:

我在 Windows 中使用 GCC 4.7。

0 投票
2 回答
5122 浏览

c++ - std::async 有什么问题?

在 C++ And Beyond 的这段剪辑的开头附近,我听到了一些关于std::async. 我有两个问题:

  1. 对于初级开发人员,是否有一套规则来说明在使用时应该做什么以及应该避免什么std::async

  2. 这段视频中存在哪些问题?它们与本文有关吗?

0 投票
1 回答
248 浏览

c++ - std::async 似乎没有使用 std::launch::async 产生线程

我正在编写一个 DCPU-16 仿真器,并且通过在单独的线程中启动一个调用函数 getRealTimeCPUClock() 的线程来计算 CPU 的实时时钟速度。问题是未来对象的“有效”属性似乎是真的,即使它没有返回值。因此,当调用 futureObj.get() 时,它会等待 getRealTimeCPUClock() 返回。

使用异步启动策略(与延迟相反)是否应该将函数启动到后台,然后在返回时将有效属性设置为 true?

这是错误的用法吗?

0 投票
1 回答
1445 浏览

c++ - 在 Visual Studio 2012 中使用嵌套的 std::async 和 std::condition_variable

我已经有了Worker类和一个Handler类来为工作创建一个抽象层。我想用std::async一些异步来混合,但我的 Visual Studio 2012(更新 1)出现了一些奇怪的行为。

我的类层次结构如下:

  • Worker是一个具有纯虚方法的抽象类InitWork
  • BasicWorker : Worker只是printf用于一些输出。
  • GroupWorker : Worker是其他工作人员的聚合。
  • Handler坚持Worker做一些工作。

然后我调用几个std::async方法,在其中创建工作程序和处理程序,在嵌套std::async调用中调用处理程序,等待工作程序的初始化(std::condition_variable此处),然后停止处理程序。

最后,我等待所有的std::futures 完成。

代码如下:

我的问题是:

  • 如果我取消注释函数中的行,WaitForInit@GroupWorker那么在进行所有第一级异步函数调用之前,不会进行嵌套的异步函数调用
  • 在等待std::condition_variable我增加作业数量时,新线程的创建感觉就像成倍地变慢。对于我的试验,低于 100 个工作存在一些异步,但超过 300 个则完全按顺序创建工作。
  • 然后,如果我取消注释方法中的printfStart,所有嵌套的异步都会像魅力一样工作

所以,

  • 我在使用中做错了std::condition_variable什么?
  • 为什么为 100 多个线程创建作业会变慢?(这个问题是可选的,似乎是操作系统的问题,可以用智能线程池概念来解决)
  • printf和这些有什么关系?(我尝试printf在竞争条件下删除所有调用,我在代码中放置了一个断点但没有帮助。情况std::cout也是如此)

编辑:我添加了启动策略(由 Jonathan Wakely 建议)以确保创建线程。但这也无济于事。我目前正在创建一个std::thread并调用thread::join函数以在第一级异步中等待。

0 投票
1 回答
9123 浏览

c++ - 完美转发到异步 lambda

我有一个函数模板,我想在其中完美地转发到我在另一个线程上运行的 lambda。这是一个可以直接编译的最小测试用例:

对于非编译情况,这是错误消息的最后一行,这是可以理解的:

我有一种感觉,它可能与如何T&&推断有关,但我无法确定确切的故障点并修复它。有什么建议么?

谢谢!

编辑:我正在使用 gcc 4.7.0 以防万一这可能是编译器问题(可能不是)

0 投票
2 回答
3408 浏览

c++ - c++11 异步延续或尝试 .then() 语义

下面的代码基于Herb Sutter实现 .then() 类型延续的想法。

这将像auto next = then(f, [](int r) { go_and_use(r); });或类似地使用。

这是一个巧妙的想法,但就目前而言是行不通的(期货只能移动,不可复制)。我确实喜欢这个想法,因为据我所知,它可能会出现在即将发布的 c++ 版本中(尽管是 .then() 甚至等待。)

在使期货共享或类似之前,我想知道堆栈溢出社区会如何看待这个实现,特别是改进和建议(甚至共享期货)?

在此先感谢您的任何建议。

(我知道这是一个修复,直到基于标准的机制存在,因为它会花费一个线程(也许)))。

0 投票
1 回答
839 浏览

c++ - 如果父/主线程死亡,std::async 调用会发生什么

如果我是对的,std::async 使用一个新线程并调用其中的方法。我想知道如果主线程或父线程死了会发生什么。控制异步方法的线程是否也会死亡。

0 投票
2 回答
6532 浏览

c++ - std::async 中的超时

有没有办法在 std::async 方法中实现超时,所以如果线程在指定的时间内没有完成,我希望这个调用超时并完成。我怎样才能实现这个功能。

0 投票
1 回答
8822 浏览

c++ - 如何取消 std::async 函数?

可能重复:
有没有办法在 C++11 中取消/分离未来?

有一个使用std::futureand异步运行的成员函数std::async。在某些情况下,我需要取消它。(该函数在对象附近连续加载,有时对象在加载时超出范围。)我已经阅读了解决同一问题的这个问题的答案,但我无法让它工作。

这是与我的实际程序具有相同结构的简化代码。在异步运行时调用Start()andKill()会导致崩溃,因为input.

在我看来,代码应该如下工作。当Kill()被调用时,运行标志被禁用。下一个命令get()应该等待线程结束,因为它会检查运行标志,所以它很快就会结束。线程取消后,input指针被删除。

似乎线程没有注意到将运行标志切换为假。我的错误是什么?