使用asio::async_read的正确模式是什么?

What is the right pattern to use with asio::async_read?

本文关键字:模式 是什么 read asio async 使用      更新时间:2023-10-16

我有一个使用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
    }
}