使用asio::async_read的正确模式是什么?
What is the right pattern to use with asio::async_read?
我有一个使用Asio与远程系统进行通信的项目。我将所有Asio代码封装在一个类中,该类在构造函数中打开一个同步连接,然后提供一个公共方法,以便该类的用户可以通过套接字进行写入。这些方法执行一个同步的asio::write
,然后调用asio::async_read
。
现在我的问题:
来自远程系统的响应时间是未知的,所以我需要让用户知道它必须等待。我正在考虑用一个状态机来做这件事,当用户执行asio::write
并在asio::async_read
的回调上再次更新它时,该状态机被初始化。这意味着客户端代码在等待read回调时必须在不确定的时间内循环一个标志,这对我来说似乎很脆弱。
是否有更好的机制来通知调用代码状态的变化?如果客户端代码是循环将asio::async_read
的回调被调用和标志更新?
使用boost::condition_variable如下:
//globals
boost::mutex mut;
boost::condition_variable cond;
bool waitflag = false;
bool response_available = false;
// inside async_read callback
bool waited;
{
boost::mutex::scoped_lock lock(mut);
if ((waited = waitflag)) // check if client loop is waiting for us
waitflag = false;
response_available = true;// write also any additional data to be read by client here
}
if (waited)
cond.notify_one(); // notify client
// inside client loop, use a short waiting time if the loop needs to perform other tasks simultaneously
{
boost::mutex::scoped_lock lock(mut);
if (!response_available) {
waitflag = true; // signal that we are waiting for callback
cond.timed_wait(lock, boost::posix_time::milliseconds(100));
}
if (response_available) { // check if data arrived
}
}
相关文章:
- libc++ 的 std::basic_string 的 16 字节对齐模式背后的原因是什么?
- Haskell中用多态性替换条件的等效模式是什么?
- 最简单的事件设计模式是什么
- 在发布模式下崩溃,但如果可调试为 true - 不是..什么是可能的问题
- 使用来自不同类的同名函数;这是什么模式
- 从C 中的函数中动态分配的缓冲区返回的最佳模式是什么?
- 解析 HTTP 的摘要式身份验证的正确正则表达式模式是什么?
- 打开文件的正确模式是什么,以便 seekp() 的工作方式与在默认模式下打开的文件相同
- 这种模式是什么意思?新建(&条目[num_entries])项目;
- 与保留模式GUI相比,使用直接模式GUI的性能含义是什么?
- 一般来说,使用Qt Creator,是什么导致程序在调试模式下编译时正确运行,但在发布模式下崩溃
- DNA模式匹配中最快的算法是什么
- 使用具有返回值的访客模式实现 AST 的最佳方法是什么?
- lock_guard始终拥有引用互斥锁的锁定模式是什么意思
- 一些数据库持久性设计模式是什么
- 这个设计模式是什么?如何使用它
- 使用"Memory Mapped Files"读取大XML数据的模式是什么?
- 使用asio::async_read的正确模式是什么?
- c++的习惯用法/模式是什么?
- 迭代地图和删除项目的最佳模式是什么?