我正在学习使用 Boost ASIO。这是从与 Boost ASIO 文档一起给出的聊天示例中复制的一些代码,
typedef std::deque<chat_message> chat_message_queue;
class chat_client
{
public:
chat_client(boost::asio::io_service& io_service,
tcp::resolver::iterator endpoint_iterator)
: io_service_(io_service),
socket_(io_service)
{
boost::asio::async_connect(socket_, endpoint_iterator,
boost::bind(&chat_client::handle_connect, this,
boost::asio::placeholders::error));
}
void write(const chat_message& msg)
{
io_service_.post(boost::bind(&chat_client::do_write, this, msg));
}
void close()
{
io_service_.post(boost::bind(&chat_client::do_close, this));
}
private:
void handle_connect(const boost::system::error_code& error)
{
//Implementation
}
void handle_read_header(const boost::system::error_code& error)
{
//Implementation
}
void handle_read_body(const boost::system::error_code& error)
{
//Implementation
}
void do_write(chat_message msg)
{
bool write_in_progress = !write_msgs_.empty();
write_msgs_.push_back(msg);
if (!write_in_progress)
{
boost::asio::async_write(socket_,
boost::asio::buffer(write_msgs_.front().data(),
write_msgs_.front().length()),
boost::bind(&chat_client::handle_write, this,
boost::asio::placeholders::error));
}
}
void handle_write(const boost::system::error_code& error)
{
//Implementation
}
void do_close()
{
socket_.close();
}
private:
boost::asio::io_service& io_service_;
tcp::socket socket_;
chat_message read_msg_;
chat_message_queue write_msgs_;
};
写入是异步的,并且不使用成员变量
write_msgs_
和read_msgs_
. 这里不应该存在并发问题吗?post
从运行的线程调用是否安全io_service::run?
呢dispatch
?从未运行的线程中进行相同的调用怎么样io_service::run
?在
doSend()
,为什么他们将消息推送到write_msgs_
而不是直接发送?同样在同一个函数中,他们为什么要检查是否write_msgs_
为空,只有在不是时才继续发送?是否write_msgs_.empty() = false
意味着正在写入?如何?如果
do_write()
仅在一个线程中调用,那么为什么我需要一个队列来维护一系列发送?不会io_service
完成手头的任务然后执行调用的异步操作do_write
吗?在上面提到的示例中使用 adispatch
而不是会有所不同吗?post