问题标签 [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 投票
1 回答
103 浏览

c++ - 成员 std::future 防止 boost::shared_ptr 超出范围

我有一个创建新桥对象并将其存储为 boost::shared_ptr 的函数:

在桥接类中有一个 std::future 变量在标头中定义并在桥接类方法中初始化:

重复调用 read() 方法 - 目标是异步调用 handle_add_data() 并在 read() 循环之间执行工作。

但是,即使在套接字关闭后(进程占用越来越多的内存),动态创建的桥对象也不会被删除。

如果我将异步调用和 future 替换为对 handle_add_data() 的直接函数调用,则在调用 close() 时所有内容都会正确释放。

如果我将 f_read 未来作为具有文件范围的静态变量移动到类外部,那么所有内容也都会正确释放,但有时我会收到“忙时销毁互斥锁​​”错误。

如果我没有将异步调用分配给任何东西,那么它会在超出函数范围时阻塞并破坏使用它的目的。

我应该怎么做才能在调用 close() 后正确删除动态创建的桥对象?

对不起,令人困惑的代码 - 我尽可能地压缩它来说明问题。

0 投票
1 回答
691 浏览

c++ - std::async lambda 函数中局部变量的生命周期

在以下代码段中:

我倾向于说这someLocalVariable无疑会比SomeReallyLongLastingProcessingPipeline()调用更长寿,即使这一切都发生在传递给 std::async 的 lambda 中。这是真的?

我不得不提到的std::future是在一个对象内部,该对象在该函数退出之前构建SomeReallyLongLastingProcessingPipeline()并在该函数退出后被破坏。

0 投票
2 回答
178 浏览

c++ - 无法异步启动带有对象参数的函数

如何将对象传递给异步启动的函数?

函数 T1 启动时没有错误。Test2 和 Test3 需要一个对象参数,但我得到了错误:没有重载函数的实例 std::async 与参数列表匹配。

0 投票
1 回答
82 浏览

c++ - 如何声明异步函数?

我是线程和异步函数的新手,我正在尝试使用异步函数从以下函数返回信息:

我正在使用以下代码执行此操作:

我收到了这个错误:

所以我想我最初的问题是你如何声明一个异步函数?

我还有一些关于异步函数如何工作的问题。如果您在一个循环中声明多个异步函数,就像我在上面所做的那样,这些函数会同时运行吗?或者他们会在循环过程中一次运行一个吗?

如果他们一次运行一个,那么在不同数量的线程中同时运行此功能的更好方法是什么?

0 投票
2 回答
298 浏览

c++ - 将函数直接传递给 std::async 和使用 std::bind 有什么区别?

我最近开始为我正在开发的库添加异步支持,但遇到了一个小问题。我从这样的事情开始(稍后的完整上下文):

那是在添加异步支持之前。我试图将其更改为:

但它编译失败。

MCVE:

它失败了:

活生生的例子

两者之间唯一的实际区别(至少我可以明显看到)是我需要显式传递this,因为我正在引用一个成员函数

我玩了一下,发现如果我用 替换它const RequestData&,它突然被允许了。但它反而会在其他地方导致问题,因为 getter 不是 const。至少从我能找到的情况来看,我需要使它成为一个 const 函数,这对 getter 本身来说很好,但我也有一些 setter,这意味着我不能这样做。

不管怎样,我想我可以试试std::bind。我将异步调用替换为:

而且,由于某种原因,它奏效了

在这里让我感到困惑的是,它两次使用相同的参数(如果计算非异步变体,则所有三次),并且考虑到this参数,因为我正在调用的函数是成员函数。

我挖得更深,找到了一些替代解决方案(std::thread尽管参考),使用std::ref. 我知道在引擎盖下std::async运行,所以我挖掘了文档std::thread

线程函数的参数按值移动或复制。如果需要将引用参数传递给线程函数,则必须对其进行包装(例如,使用std::refor std::cref)。 (强调我的)

这是有道理的,并解释了它失败的原因。我认为std::async也受此限制,并解释了它失败的原因。

但是,挖掘std::bind

bind 的参数被复制或移动,并且永远不会通过引用传递,除非包裹在std::refor中std::cref。(强调我的)

我不使用(或者如果我用,std::ref替换),但至少如果我理解文档正确,这两个都应该无法编译。cppreference.com 上的示例也无需编译(在 Coliru 中使用 Clang 和 C++ 17 进行了测试)。conststd::crefstd::cref

这里发生了什么?

如果重要的话,除了 coliru 环境,我最初在 Docker 中重现了这个问题,运行 Ubuntu 18.04 和 Clang 8.0.1(64 位)。在这两种情况下都针对 C++ 17 编译。

0 投票
1 回答
246 浏览

c++ - 如何将此 std::function 传递给 std::async

我正在处理一段多线程代码,但我似乎无法将 std::function 对象传递给 std::async 函数。我确定我做错了什么,但我不知道那会是什么。因此,我准备了这段代码,所以也许知道的人可以帮助我。

Test1 证明这个 std::function 对象有效。
Test2 包含我想要它做的事情;只有我将函数对象包装成一个 lambda。
Test3 包含我无法弄清楚的示例。

可以在此处找到此示例的完整代码。Stackoverflow 编辑器警告说,我不允许转储完整的代码文件,这就是为什么我在这里把它归结为它的本质。

我收到的编译器错误是:
no matching function for call to 'async(std::function&, AsyncFunctionExample&)' const std::future function_future = std::async(current_function, *this);

这对我没有多大帮助。它基本上向我解释了没有与我的电话匹配的签名。但是我无法从这个错误中找出我的调用的哪一部分是错误的,我不明白如何更改它以便它可以工作。

0 投票
3 回答
462 浏览

c++ - 使用比非异步方法慢的 std::async 来填充向量

我正在尝试使用 std::async 来填充向量。它背后的想法是使用多线程来节省时间。然而,运行一些基准测试我发现我的非异步方法更快!

异步:

非异步:

我的基准测试表明异步方法比非异步方法慢 71 倍。我究竟做错了什么?

0 投票
1 回答
920 浏览

c++ - 在 C++ 中异步执行 sql 查询

我有一个将数据读入地图并将它们写入 sqlite 数据库的应用程序。该应用程序做了很多其他事情,并且是异步的(使用 boost asio),除了写入 db 部分。这是示例伪代码:

我最初的计划是在 for 循环中生成一个新线程,它将并行写入数据库中的每条记录。有两个问题。

1) 可能需要实现数据库锁定。

2) sqlitebind(), step() and reset()对同一条语句进行操作。因此,必须按顺序写入记录。

我正在使用 C++ 17。关于使数据库调用异步的任何建议?感谢您的帮助!

0 投票
1 回答
123 浏览

c++ - 如何使用 std::async 显示 Cdialog

我有一个名为 A 的派生类继承自CDialog,我为名为 a 的 A 创建了对象,并希望利用成员函数 domodal 来显示对话框。尽管如此,此对话框无法显示,并且父窗口被阻止。

谁能帮帮我,谢谢!

0 投票
3 回答
272 浏览

c++ - 为什么 `std::async` 不能选择正确的重载?

请考虑以下示例:

我对多线程仍然很陌生,但是为什么 - 在地球上 - 不能std::async选择正确的重载?第二个重载使用对std::promise对象的引用。

我在这里看过这个问题,但没有解释为什么。此外,我没有收到歧义错误。

我得到的错误是: