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
書き込みが行われているということですか?どのように?1 つのスレッドでのみ呼び出される場合
do_write()
、送信シーケンスを維持するためにキューが必要なのはなぜですか?io_service
手元のタスクを終了してから、によって呼び出された非同期操作を実行しませんdo_write
か?dispatch
代わりにa を使用するpost
と、上記の例に違いが生じますか?