我正在学习如何使用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_
周围没有使用锁。这里不应该存在并发问题吗?从运行
io_service::run
的线程中调用post
是否安全?那dispatch
呢?从未运行io_service::run
的线程中进行相同的调用是否安全?在
doSend()
中,为什么要将消息推入write_msgs_
而不是直接发送?同时在相同的函数中,为什么要检查write_msgs_
是否为空,只有当它不为空时才继续发送?write_msgs_.empty() = false
是什么意思?如何实现的?如果
do_write()
只在一个线程中被调用,那么为什么需要队列来维护发送序列?io_service
不会完成手头的任务,然后执行由do_write
调用的异步操作吗?在上面提到的示例中,使用dispatch
而不是post
会有什么区别吗?