问题标签 [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 回答
819 浏览

c++11 - 是否可以取消 C++ 11 或 14 中的阻塞调用?

我的 gcc 编译器支持 C++ 14。

场景:
我想知道是否有一种方法可以强制取消阻塞呼叫并std::thread安全地停止我的呼叫。

代码:

在上面的代码ReadValue中是一个阻塞调用,它进入一个库并在 fd 上读取一些我无法控制的与设备驱动程序相关的代码。

问题:
我需要StopThread能够停止线程并取消正在阻塞的调用ReadValue我怎样才能做到这一点?C++ 11 或 14 中有什么方法吗?

PS:
可能std::async是一个解决方案?但我想知道是否有更好的方法。如果std::async是最好的方法,那么如何在这种情况下有效地使用它而不会造成不良的副作用。

0 投票
0 回答
581 浏览

c++ - C++ std::future 挂起超时

全部

我已经设置了一个测试项目来学习 std::future 及其与 std::async 的使用。这是一个简单的控制台应用程序,代码如下

我注意到 Visual Studion 2017 有一个奇怪的行为。如果我将项目属性->代码生成->运行时库设置为 /MTd 或 /MT 这个程序在退出时挂起并且调用堆栈显示

另一方面,如果我将项目属性-> 代码生成-> 运行时库设置为 /MD 或 /MDd,则该程序退出正常。

任何想法为什么会发生这种情况?感谢任何帮助,谢谢!

0 投票
1 回答
712 浏览

c++ - std::async(std::launch::deferred) + std::future::then 的行为

延迟未来(仅通过std::async使用std::launch::deferred标志调用实现)背后的想法是,只有当有人试图等待或提取未来的未来值或异常时才会调用回调。到那时回调不会执行。

如果我将 continuation 附加到 deferred future 会发生什么std::future::then?延迟的未来会丢失(then使未来无效),而是返回一个新的未来。

这种情况下,按照标准,应该怎么办?新的未来也是延迟的未来吗?它会只是僵局吗?最新文档中没有解决这个问题。

0 投票
0 回答
80 浏览

c++ - C++ - 使用异步运行函数会导致随机阻塞

我正在创建一个工作进程,它IDs在管道上等待并针对每个 ID 尝试获取一些数据。此获取可能需要一段时间,因此我还创建了一个异步任务来处理超时逻辑。

问题是,如果我通过管道向它发送多个 ID,它将对前 2 个 ID 正常工作,但随后随机阻塞,直到超时到期,之后它将获取下一个 ID。

我的代码附在下面,我正在做的是为每个 ID 创建 2 个异步任务(我猜它们在自己的线程上运行)一个任务用于查询(get_data),另一个用于超时。我不是专家,但我的理解是,将为每个消息的异步任务创建线程,而主线程继续从管道读取消息。

如果有人能指导我弄清楚它为什么会阻塞,将不胜感激。

0 投票
1 回答
47 浏览

c++ - 将 std::async 与 std::launch::async 一起使用时的奇怪行为

我正试图绕过std::asyncstd::futures在 C++11 中引入。

我得到的上述程序的输出如下所示。

我的问题是因为我使用std::launch::async执行应该立即使用另一个线程开始。输出告诉我它打印了该行Get the results,然后才开始执行。(从上面的日志中可以明显看出)。也hog_cpu_ex开始前hog_cpu。有人可以解释为什么会发生这种情况。

0 投票
1 回答
424 浏览

c++ - std::launch::async 不同线程的数量是否正确?

我正在阅读 abut std::async with std::launch::async 并使用该策略阅读,可调用将在新线程中调用。

所以为了测试,我做了如下:

因此,基于此,我将期望 3 个线程:

  • 线程1:主线程
  • 线程 2:std::async 的第一次调用(执行生产 fct)
  • 线程3:第二次调用std::async(执行consume fct)

当我运行程序时,我得到:

enter image description here

为什么 std::async 的两个调用具有相同的线程 ID?

谢谢你。

0 投票
2 回答
111 浏览

c++ - 可变参数模板的 C++ 错误

我有以下代码使用可变参数模板调用 std::async,

但我收到以下编译错误消息:

没有匹配函数调用 'async(std::launch, bool (TestChild:: &)(int, int, bool&, std::vector&), TestParent , int&, int&, bool&, TestChild*&, std::vector *&)' startInx, endInx, nothingToCheck, args ... ) );

我认为这可能与我将附加参数与参数包一起传递的事实有关。任何人都知道这有什么问题,我应该怎么做才能让它发挥作用?

0 投票
0 回答
137 浏览

c++ - std::async 的交叉编译错误

背景

  1. 我在 Ubuntu 18.04 上使用 crosstool-ng 为我的 ARMv7 Raspberry Pi 构建了一个工具链。由于GCC 6.3.0 的 GCC 7.1 编译存在问题,我对 ubsan.c 文件进行了一些修改。
  2. 我在 Raspberry Pi 本身上构建了所​​需的库,使用symlink 实用程序将符号链接从绝对更改为相对,压缩 /usr 和 /lib 目录以进行传输,并将它们安装在我的工作 sysroot 目录中。
  3. 该工具链已被证明适用于许多大型项目。

问题

我使用paho.mqtt.cpp库构建了一个简单的应用程序。此应用程序使用库要求的 C++11 标准。该应用程序在我的开发机器上编译和在 Raspberry Pi 上编译时编译和执行。但是,当我使用上述工具链时,我收到与库使用 std::async 相关的错误。

尝试修复

  1. 我尝试使用 -nostdinc 标志来阻止编译器使用其标准头文件并使用 sysroot 中的头文件。错误仍然存​​在。
  2. 我尝试用future安装在 Pi 中的文件替换错误中提到的文件(它只有很小的区别)。错误仍然存​​在。

我的问题

任何人都可以指出此错误的原因以及可能需要调查的事情吗?我是否应该尝试以不同的方式重建工具链,或者我可能缺少一些标志?

0 投票
2 回答
277 浏览

c++ - asio::strand 上的任务在单个线程上运行

我在这里使用 4a中的库的独立版本修改了一个 asio 链示例

问题是:当我运行代码时,函数 PrintNum 似乎只在单个线程上运行

因为控制台输出是

我的问题是,我是否需要配置 strand 以让任务传播到所有线程?或者我在这里错过了什么?

[编辑] 理想情况下,输出应该类似于

在预期的输出中,线程00154FB0001532B0执行了 PrintNum(),但在修改后的版本中,只有一个线程执行了 PrintNum()。

如果未使用该链,则输出为:

谢谢

这是我正在使用的机器的 cpu 信息

操作系统是 Ubuntu 18.04

0 投票
2 回答
239 浏览

multithreading - 在主函数以外的函数中使用 std::async 时的作用域块

我对 st::async 有一些问题,什么时候在 Main 函数以外的其他函数中使用它,假设我有像流动这样的函数:

此代码的输出是:

这不好,主线程等待其他线程结束。

我希望 runningAsync() 函数在其他线程中运行,同时在屏幕上打印主线程中的“Main Function”,这可以通过 std::thread 实现。

这是同时运行此功能的方式(并发)吗?