问题标签 [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++11 - 是否可以取消 C++ 11 或 14 中的阻塞调用?
我的 gcc 编译器支持 C++ 14。
场景:
我想知道是否有一种方法可以强制取消阻塞呼叫并std::thread
安全地停止我的呼叫。
代码:
在上面的代码ReadValue
中是一个阻塞调用,它进入一个库并在 fd 上读取一些我无法控制的与设备驱动程序相关的代码。
问题:
我需要StopThread
能够停止线程并取消正在阻塞的调用ReadValue
。我怎样才能做到这一点?C++ 11 或 14 中有什么方法吗?
PS:
可能std::async
是一个解决方案?但我想知道是否有更好的方法。如果std::async
是最好的方法,那么如何在这种情况下有效地使用它而不会造成不良的副作用。
c++ - C++ std::future 挂起超时
全部
我已经设置了一个测试项目来学习 std::future 及其与 std::async 的使用。这是一个简单的控制台应用程序,代码如下
我注意到 Visual Studion 2017 有一个奇怪的行为。如果我将项目属性->代码生成->运行时库设置为 /MTd 或 /MT 这个程序在退出时挂起并且调用堆栈显示
另一方面,如果我将项目属性-> 代码生成-> 运行时库设置为 /MD 或 /MDd,则该程序退出正常。
任何想法为什么会发生这种情况?感谢任何帮助,谢谢!
c++ - std::async(std::launch::deferred) + std::future::then 的行为
延迟未来(仅通过std::async
使用std::launch::deferred
标志调用实现)背后的想法是,只有当有人试图等待或提取未来的未来值或异常时才会调用回调。到那时回调不会执行。
如果我将 continuation 附加到 deferred future 会发生什么std::future::then
?延迟的未来会丢失(then
使未来无效),而是返回一个新的未来。
这种情况下,按照标准,应该怎么办?新的未来也是延迟的未来吗?它会只是僵局吗?最新文档中没有解决这个问题。
c++ - C++ - 使用异步运行函数会导致随机阻塞
我正在创建一个工作进程,它IDs
在管道上等待并针对每个 ID 尝试获取一些数据。此获取可能需要一段时间,因此我还创建了一个异步任务来处理超时逻辑。
问题是,如果我通过管道向它发送多个 ID,它将对前 2 个 ID 正常工作,但随后随机阻塞,直到超时到期,之后它将获取下一个 ID。
我的代码附在下面,我正在做的是为每个 ID 创建 2 个异步任务(我猜它们在自己的线程上运行)一个任务用于查询(get_data
),另一个用于超时。我不是专家,但我的理解是,将为每个消息的异步任务创建线程,而主线程继续从管道读取消息。
如果有人能指导我弄清楚它为什么会阻塞,将不胜感激。
c++ - 将 std::async 与 std::launch::async 一起使用时的奇怪行为
我正试图绕过std::async
并std::futures
在 C++11 中引入。
我得到的上述程序的输出如下所示。
我的问题是因为我使用std::launch::async
执行应该立即使用另一个线程开始。输出告诉我它打印了该行Get the results
,然后才开始执行。(从上面的日志中可以明显看出)。也hog_cpu_ex
开始前hog_cpu
。有人可以解释为什么会发生这种情况。
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 ... ) );
我认为这可能与我将附加参数与参数包一起传递的事实有关。任何人都知道这有什么问题,我应该怎么做才能让它发挥作用?
c++ - std::async 的交叉编译错误
背景
- 我在 Ubuntu 18.04 上使用 crosstool-ng 为我的 ARMv7 Raspberry Pi 构建了一个工具链。由于GCC 6.3.0 的 GCC 7.1 编译存在问题,我对 ubsan.c 文件进行了一些修改。
- 我在 Raspberry Pi 本身上构建了所需的库,使用symlink 实用程序将符号链接从绝对更改为相对,压缩 /usr 和 /lib 目录以进行传输,并将它们安装在我的工作 sysroot 目录中。
- 该工具链已被证明适用于许多大型项目。
问题
我使用paho.mqtt.cpp库构建了一个简单的应用程序。此应用程序使用库要求的 C++11 标准。该应用程序在我的开发机器上编译和在 Raspberry Pi 上编译时编译和执行。但是,当我使用上述工具链时,我收到与库使用 std::async 相关的错误。
尝试修复
- 我尝试使用 -nostdinc 标志来阻止编译器使用其标准头文件并使用 sysroot 中的头文件。错误仍然存在。
- 我尝试用
future
安装在 Pi 中的文件替换错误中提到的文件(它只有很小的区别)。错误仍然存在。
我的问题
任何人都可以指出此错误的原因以及可能需要调查的事情吗?我是否应该尝试以不同的方式重建工具链,或者我可能缺少一些标志?
c++ - asio::strand 上的任务在单个线程上运行
我在这里使用 4a中的库的独立版本修改了一个 asio 链示例
问题是:当我运行代码时,函数 PrintNum 似乎只在单个线程上运行
因为控制台输出是
我的问题是,我是否需要配置 strand 以让任务传播到所有线程?或者我在这里错过了什么?
[编辑] 理想情况下,输出应该类似于
在预期的输出中,线程00154FB0
和001532B0
执行了 PrintNum(),但在修改后的版本中,只有一个线程执行了 PrintNum()。
如果未使用该链,则输出为:
谢谢
这是我正在使用的机器的 cpu 信息
操作系统是 Ubuntu 18.04
荣
multithreading - 在主函数以外的函数中使用 std::async 时的作用域块
我对 st::async 有一些问题,什么时候在 Main 函数以外的其他函数中使用它,假设我有像流动这样的函数:
此代码的输出是:
这不好,主线程等待其他线程结束。
我希望 runningAsync() 函数在其他线程中运行,同时在屏幕上打印主线程中的“Main Function”,这可以通过 std::thread 实现。
这是同时运行此功能的方式(并发)吗?