问题标签 [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.
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
阻塞的任何提示。
c++ - c++11 std::async 在 mingw 中不起作用
从 Herb Sutter 的演示文稿中运行此代码。这在 gcc 4.6.3 下的 linux 中运行良好。我在想mingw不支持future.h,但是这个错误真的很难理解!
这是错误:
我在 Windows 中使用 GCC 4.7。
c++ - std::async 有什么问题?
在 C++ And Beyond 的这段剪辑的开头附近,我听到了一些关于std::async
. 我有两个问题:
对于初级开发人员,是否有一套规则来说明在使用时应该做什么以及应该避免什么
std::async
?这段视频中存在哪些问题?它们与本文有关吗?
c++ - std::async 似乎没有使用 std::launch::async 产生线程
我正在编写一个 DCPU-16 仿真器,并且通过在单独的线程中启动一个调用函数 getRealTimeCPUClock() 的线程来计算 CPU 的实时时钟速度。问题是未来对象的“有效”属性似乎是真的,即使它没有返回值。因此,当调用 futureObj.get() 时,它会等待 getRealTimeCPUClock() 返回。
使用异步启动策略(与延迟相反)是否应该将函数启动到后台,然后在返回时将有效属性设置为 true?
这是错误的用法吗?
c++ - 在 Visual Studio 2012 中使用嵌套的 std::async 和 std::condition_variable
我已经有了Worker
类和一个Handler
类来为工作创建一个抽象层。我想用std::async
一些异步来混合,但我的 Visual Studio 2012(更新 1)出现了一些奇怪的行为。
我的类层次结构如下:
Worker
是一个具有纯虚方法的抽象类Init
。Work
BasicWorker : Worker
只是printf
用于一些输出。GroupWorker : Worker
是其他工作人员的聚合。Handler
坚持Worker
做一些工作。
然后我调用几个std::async
方法,在其中创建工作程序和处理程序,在嵌套std::async
调用中调用处理程序,等待工作程序的初始化(std::condition_variable
此处),然后停止处理程序。
最后,我等待所有的std::future
s 完成。
代码如下:
我的问题是:
- 如果我取消注释函数中的行,
WaitForInit@GroupWorker
那么在进行所有第一级异步函数调用之前,不会进行嵌套的异步函数调用 - 在等待
std::condition_variable
我增加作业数量时,新线程的创建感觉就像成倍地变慢。对于我的试验,低于 100 个工作存在一些异步,但超过 300 个则完全按顺序创建工作。 - 然后,如果我取消注释方法中的
printf
行Start
,所有嵌套的异步都会像魅力一样工作
所以,
- 我在使用中做错了
std::condition_variable
什么? - 为什么为 100 多个线程创建作业会变慢?(这个问题是可选的,似乎是操作系统的问题,可以用智能线程池概念来解决)
- 这
printf
和这些有什么关系?(我尝试printf
在竞争条件下删除所有调用,我在代码中放置了一个断点但没有帮助。情况std::cout
也是如此)
编辑:我添加了启动策略(由 Jonathan Wakely 建议)以确保创建线程。但这也无济于事。我目前正在创建一个std::thread
并调用thread::join
函数以在第一级异步中等待。
c++ - 完美转发到异步 lambda
我有一个函数模板,我想在其中完美地转发到我在另一个线程上运行的 lambda。这是一个可以直接编译的最小测试用例:
对于非编译情况,这是错误消息的最后一行,这是可以理解的:
我有一种感觉,它可能与如何T&&
推断有关,但我无法确定确切的故障点并修复它。有什么建议么?
谢谢!
编辑:我正在使用 gcc 4.7.0 以防万一这可能是编译器问题(可能不是)
c++ - c++11 异步延续或尝试 .then() 语义
下面的代码基于Herb Sutter实现 .then() 类型延续的想法。
这将像auto next = then(f, [](int r) { go_and_use(r); });
或类似地使用。
这是一个巧妙的想法,但就目前而言是行不通的(期货只能移动,不可复制)。我确实喜欢这个想法,因为据我所知,它可能会出现在即将发布的 c++ 版本中(尽管是 .then() 甚至等待。)
在使期货共享或类似之前,我想知道堆栈溢出社区会如何看待这个实现,特别是改进和建议(甚至共享期货)?
在此先感谢您的任何建议。
(我知道这是一个修复,直到基于标准的机制存在,因为它会花费一个线程(也许)))。
c++ - 如果父/主线程死亡,std::async 调用会发生什么
如果我是对的,std::async 使用一个新线程并调用其中的方法。我想知道如果主线程或父线程死了会发生什么。控制异步方法的线程是否也会死亡。
c++ - std::async 中的超时
有没有办法在 std::async 方法中实现超时,所以如果线程在指定的时间内没有完成,我希望这个调用超时并完成。我怎样才能实现这个功能。
c++ - 如何取消 std::async 函数?
可能重复:
有没有办法在 C++11 中取消/分离未来?
有一个使用std::future
and异步运行的成员函数std::async
。在某些情况下,我需要取消它。(该函数在对象附近连续加载,有时对象在加载时超出范围。)我已经阅读了解决同一问题的这个问题的答案,但我无法让它工作。
这是与我的实际程序具有相同结构的简化代码。在异步运行时调用Start()
andKill()
会导致崩溃,因为input
.
在我看来,代码应该如下工作。当Kill()
被调用时,运行标志被禁用。下一个命令get()
应该等待线程结束,因为它会检查运行标志,所以它很快就会结束。线程取消后,input
指针被删除。
似乎线程没有注意到将运行标志切换为假。我的错误是什么?