我有一个带有必须保持运行的主循环的程序。有时会向网络发出请求,所以我将它们推迟到产生另一个线程的请求发出服务。对最终响应采取行动的最佳方式是什么?
我的想法是在发出请求时设置一个变量,用互斥锁保护它,并让服务线程在完成后翻转变量,并做出响应。这意味着我必须不断检查主循环中的变量。这是最好的方法吗?
我熟悉 Javascript 中的异步编程,但只有一个线程,所以回调可以安全地完成所有工作。
谢谢你。
编辑:我正在使用 C++ 17。
最佳答案
对于大量流量,我会使用线程来执行网络,使用包含互斥体、双端队列和条件变量的“IPC”对象。
使用 std::shared_ptr
将 IPC 共享到主上下文和线程上下文。
当线程接收到消息时,它会锁定互斥锁(使用 std::lock_guard
)并将消息推送到双端队列。在锁之外,然后向条件变量发出信号。
主线程将等待条件变量,当发出信号时,它将锁定互斥体并从双端队列中弹出任何内容。请注意,您使用互斥锁仅保护双端队列。
.
另一种方法是使用 std::async
接收消息的方法,主程序将使用 get
等待它方法将等到异步方法完成。
我将选择很大程度上取决于您打算建立多少网络。如果只是偶尔的“打开-发送-接收-关闭”事务,那么肯定会考虑使用异步。
关于C++异步等待响应,最佳设计?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63646459/