c++ - C ++异步等待响应,最佳设计?
问题描述
我有一个带有必须保持运行的主循环的程序。有时会向网络发出请求,所以我将它们推迟到产生另一个线程的请求发出服务。对最终响应采取行动的最佳方式是什么?
我的想法是在发出请求时设置一个变量,用互斥锁保护它,并让服务线程在完成时翻转变量,并做出响应。这意味着我必须不断检查主循环中的变量。这是最好的方法吗?
我熟悉 Javascript 中的异步编程,但只有一个线程,所以回调可以安全地完成所有工作。
谢谢你。
编辑:我正在使用 C++ 17。
解决方案
对于大量流量,我会使用线程来执行网络,使用包含互斥体、双端队列和条件变量的“IPC”对象。
使用 astd::shared_ptr
将 IPC 共享给主上下文和线程上下文。
当线程接收到消息时,它会锁定互斥锁(使用std::lock_guard
)并将消息推送到双端队列。在锁之外,然后向条件变量发出信号。
主线程将等待条件变量,当发出信号时,它将锁定互斥体并从双端队列中弹出任何内容。请注意,您使用互斥锁仅保护双端队列。
.
另一种方法是使用一种std::async
方法来接收消息,并且主程序将使用该方法等待它,该get
方法将等待异步方法完成。
我将选择很大程度上取决于您打算建立多少网络。如果只是偶尔的“打开-发送-接收-关闭”事务,那么肯定会考虑使用异步。
推荐阅读
- node.js - 使用 lowdb 会导致 ERR_REQUIRE_ESM
- javascript - 动态更新变量名
- python - 如何从另一个类方法继承变量
- r - 如何绑定列表中的 data.frames 行并添加一个包含列表元素名称的新列?
- json - 数据类型映射:提取几个原子值
- flutter - 在flutter getx中对空值使用空检查运算符
- javascript - html javascript在主页中存储多个页面
- rust - 在 gtk-rs 中,如何获取 gtk::Window (大部分)在的当前屏幕?
- c - 如何检查一个大的二进制文件是否包含另一个文件的内容?
- python - grpc_tools.protoc -> '无法使原始路径相对'