问题标签 [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::future 防止 boost::shared_ptr 超出范围
我有一个创建新桥对象并将其存储为 boost::shared_ptr 的函数:
在桥接类中有一个 std::future 变量在标头中定义并在桥接类方法中初始化:
重复调用 read() 方法 - 目标是异步调用 handle_add_data() 并在 read() 循环之间执行工作。
但是,即使在套接字关闭后(进程占用越来越多的内存),动态创建的桥对象也不会被删除。
如果我将异步调用和 future 替换为对 handle_add_data() 的直接函数调用,则在调用 close() 时所有内容都会正确释放。
如果我将 f_read 未来作为具有文件范围的静态变量移动到类外部,那么所有内容也都会正确释放,但有时我会收到“忙时销毁互斥锁”错误。
如果我没有将异步调用分配给任何东西,那么它会在超出函数范围时阻塞并破坏使用它的目的。
我应该怎么做才能在调用 close() 后正确删除动态创建的桥对象?
对不起,令人困惑的代码 - 我尽可能地压缩它来说明问题。
c++ - std::async lambda 函数中局部变量的生命周期
在以下代码段中:
我倾向于说这someLocalVariable
无疑会比SomeReallyLongLastingProcessingPipeline()
调用更长寿,即使这一切都发生在传递给 std::async 的 lambda 中。这是真的?
我不得不提到的std::future
是在一个对象内部,该对象在该函数退出之前构建SomeReallyLongLastingProcessingPipeline()
并在该函数退出后被破坏。
c++ - 无法异步启动带有对象参数的函数
如何将对象传递给异步启动的函数?
函数 T1 启动时没有错误。Test2 和 Test3 需要一个对象参数,但我得到了错误:没有重载函数的实例 std::async 与参数列表匹配。
c++ - 如何声明异步函数?
我是线程和异步函数的新手,我正在尝试使用异步函数从以下函数返回信息:
我正在使用以下代码执行此操作:
我收到了这个错误:
所以我想我最初的问题是你如何声明一个异步函数?
我还有一些关于异步函数如何工作的问题。如果您在一个循环中声明多个异步函数,就像我在上面所做的那样,这些函数会同时运行吗?或者他们会在循环过程中一次运行一个吗?
如果他们一次运行一个,那么在不同数量的线程中同时运行此功能的更好方法是什么?
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::ref
orstd::cref
)。 (强调我的)
这是有道理的,并解释了它失败的原因。我认为std::async
也受此限制,并解释了它失败的原因。
但是,挖掘std::bind:
bind 的参数被复制或移动,并且永远不会通过引用传递,除非包裹在
std::ref
or中std::cref
。(强调我的)
我不使用(或者如果我用,std::ref
替换),但至少如果我理解文档正确,这两个都应该无法编译。cppreference.com 上的示例也无需编译(在 Coliru 中使用 Clang 和 C++ 17 进行了测试)。const
std::cref
std::cref
这里发生了什么?
如果重要的话,除了 coliru 环境,我最初在 Docker 中重现了这个问题,运行 Ubuntu 18.04 和 Clang 8.0.1(64 位)。在这两种情况下都针对 C++ 17 编译。
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);
这对我没有多大帮助。它基本上向我解释了没有与我的电话匹配的签名。但是我无法从这个错误中找出我的调用的哪一部分是错误的,我不明白如何更改它以便它可以工作。
c++ - 使用比非异步方法慢的 std::async 来填充向量
我正在尝试使用 std::async 来填充向量。它背后的想法是使用多线程来节省时间。然而,运行一些基准测试我发现我的非异步方法更快!
异步:
非异步:
我的基准测试表明异步方法比非异步方法慢 71 倍。我究竟做错了什么?
c++ - 在 C++ 中异步执行 sql 查询
我有一个将数据读入地图并将它们写入 sqlite 数据库的应用程序。该应用程序做了很多其他事情,并且是异步的(使用 boost asio),除了写入 db 部分。这是示例伪代码:
我最初的计划是在 for 循环中生成一个新线程,它将并行写入数据库中的每条记录。有两个问题。
1) 可能需要实现数据库锁定。
2) sqlitebind(), step() and reset()
对同一条语句进行操作。因此,必须按顺序写入记录。
我正在使用 C++ 17。关于使数据库调用异步的任何建议?感谢您的帮助!
c++ - 如何使用 std::async 显示 Cdialog
我有一个名为 A 的派生类继承自CDialog
,我为名为 a 的 A 创建了对象,并希望利用成员函数 domodal 来显示对话框。尽管如此,此对话框无法显示,并且父窗口被阻止。
谁能帮帮我,谢谢!
c++ - 为什么 `std::async` 不能选择正确的重载?
请考虑以下示例:
我对多线程仍然很陌生,但是为什么 - 在地球上 - 不能std::async
选择正确的重载?第二个重载使用对std::promise
对象的引用。
我在这里看过这个问题,但没有解释为什么。此外,我没有收到歧义错误。
我得到的错误是: