Boost ASIOの非同期読み取り機能を使用すると、同期読み取りを行う別のスレッドを使用する場合と比較して、パフォーマンス上の利点があるかどうか不思議です。ユース・ケースでは、リモート・ホストからのデータを常にリッスンする必要があります。ブーストasync_readと同期スレッドのブロッキング - パフォーマンスの違い?
非同期の場合、ioservice.run()は読み取るデータがあるまでスレッドをブロックすると信じています。同期の場合、boost :: asio:readコールは読み取るデータがあるまでブロックされます。非同期読み取りを使用する利点はありますか? iOService_run()がブロックするので、async_readを使用するときにアプリケーションがデータを待っている間にバックグラウンドで何かを必要とする場合、別のスレッドも必要になるようです。
コードは以下のようなもの(向かいのアイデアを取得しようと、コンパイルされない場合があります)次のようになります。非同期を使用して
読み取り:同期を使用して
#include <iostream>
#include <boost/asio.hpp>
void read_handler(const boost::system::error_code &ec)
{
//Read incoming message
//Chain the callbacks
socket.async_read(read_handler);
}
int main()
{
std::string host = "192.168.1.3";
std::string port = "8888";
std::cout << "Attemping connection to host " << host << " on port " << port << std::endl;
boost::asio::connect(tcpSocket, resolver.resolve({host, port}));
std::cout << "Connected" << std::endl;
socket.async_read(read_handler);
//Will block until there is data to read?
ioservice.run();
return 0;
}
は別のスレッドで読み取ります
#include <thread>
void readThread()
{
while(true)
{
//Will block until there is data to read
boost::asio::read(tcpSocket, boost::asio::buffer(buffer, size));
}
}
int main()
{
std::string host = "192.168.1.3";
std::string port = "8888";
std::cout << "Attemping connection to host " << host << " on port " << port << std::endl;
boost::asio::connect(tcpSocket, resolver.resolve({host, port}));
std::cout << "Connected" << std::endl;
std::thread r{readThread};
return 0;
}
ありがとうございます!私の経験不足をアジアとネットワークで許してください:)
ネットワークはレート決定のステップです。どのAPIを使用するのかはほとんど関係ありません。 – EJP