我有一个使用Asio与远程系统对话的项目。我将所有Asio代码封装在一个类中,该类在构造函数中打开同步连接,然后提供一个公共方法,以便类的用户可以在套接字上进行写操作。这些方法执行同步asio::write
,然后调用asio::async_read
。
现在我的问题:
来自远程系统的响应时间未知,因此我需要让用户知道它必须等待。我正在考虑使用状态机来执行此操作,该状态机在用户执行asio::write
时初始化,并在asio::async_read
的回调上再次更新。这意味着客户端代码在等待读取回调时必须循环一个标志以获得不确定的时间,这对我来说似乎很脆弱。
是否有更好的机制来通知调用状态的代码?如果客户端代码是循环的,那么将调用asio::async_read
的回调并更新标志吗?
答案 0 :(得分:1)
使用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
}
}