C++异步等待响应,最佳设计?

标签 c++ c++17

我有一个带有必须保持运行的主循环的程序。有时会向网络发出请求,所以我将它们推迟到产生另一个线程的请求发出服务。对最终响应采取行动的最佳方式是什么?
我的想法是在发出请求时设置一个变量,用互斥锁保护它,并让服务线程在完成后翻转变量,并做出响应。这意味着我必须不断检查主循环中的变量。这是最好的方法吗?
我熟悉 Javascript 中的异步编程,但只有一个线程,所以回调可以安全地完成所有工作。
谢谢你。
编辑:我正在使用 C++ 17。

最佳答案

对于大量流量,我会使用线程来执行网络,使用包含互斥体、双端队列和条件变量的“IPC”对象。
使用 std::shared_ptr将 IPC 共享到主上下文和线程上下文。
当线程接收到消息时,它会锁定互斥锁(使用 std::lock_guard )并将消息推送到双端队列。在锁之外,然后向条件变量发出信号。
主线程将等待条件变量,当发出信号时,它将锁定互斥体并从双端队列中弹出任何内容。请注意,您使用互斥锁仅保护双端队列。
.
另一种方法是使用 std::async接收消息的方法,主程序将使用 get 等待它方法将等到异步方法完成。
我将选择很大程度上取决于您打算建立多少网络。如果只是偶尔的“打开-发送-接收-关闭”事务,那么肯定会考虑使用异步。

关于C++异步等待响应,最佳设计?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63646459/

相关文章:

c++ - 模板化 vector 的构造函数(数学类)

c++ - MsiGetTargetPath C++

c++ - 什么是合约(为 C++17 提议的)?

c++ - 是否保证模板模板参数调用用户提供的推导指南

c++ - 无法使用 CMake 和 CUDA 构建共享库

c++ - 链接器错误 - 其他包含目录问题?

c++ - 用gdb调试的时候,汇编代码前面的调试信息是什么意思?

c++ - 为什么我不能在constexpr lambda函数中使用std::tuple

c++ - 如何在列表中存储自删除 future

c++ - "there is no smaller array object that satisfies these constraints"是什么意思?