そう、
Boost asio 関数とソケット (特に非同期読み取り/書き込み) で遊んでいます。さて、ネットワーク接続から新しいバッファーが入ったときにのみハンドラーを呼び出すと思いboost::asio::async_read
ました...しかし、同じバッファーの読み取りを停止しないため、ハンドラーを呼び出し続けます。転送されたバイト数をチェックすることで軽減できましたが、基本的には CPU サイクルを浪費するビジー待機ループにあります。
ここに私が持っているものがあります:
class tcp_connection : : public boost::enable_shared_from_this<tcp_connection>
{
public:
// other functions here
void start()
{
boost::asio::async_read(socket_, boost::asio::buffer(buf, TERRAINPACKETSIZE),
boost::bind(&tcp_connection::handle_read, shared_from_this(),
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
}
private:
const unsigned int TERRAINPACKETSIZE = 128;
char buf[TERRAINPACKETSIZE];
void handle_read(const boost::system::error_code& error, size_t bytesT)
{
if (bytesT > 0)
{
// Do the packet handling stuff here
}
boost::asio::async_read(socket_, boost::asio::buffer(buf, TERRAINPACKETSIZE),
boost::bind(&tcp_connection::handle_read, shared_from_this(),
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
}
};
いくつかは切り取られていますが、基本的には新しい接続が作成されてからstart()
呼び出されます。handle_read
メソッドが継続的に呼び出されないように、私が見逃しているものはありますか?