我很好奇,如果在Boost ASIO中使用异步读取功能相比于使用单独读取同步的线程有任何性能优势。用例将不得不始终监听来自远程主机的数据。Boost async_read vs阻塞同步线程 - 性能差异?
在异步情况下,我相信ioservice.run()会阻塞线程,直到有数据被读取。在同步的情况下,boost :: asio:read调用会阻塞,直到有数据被读取。使用异步读取有什么好处吗?看起来如果应用程序在等待数据时需要在后台执行任何操作,那么在使用async_read时也需要单独的线程,因为ioservice_run()会阻塞。
的代码将类似于以下(可能无法编译,只是试图跨越的想法):
使用异步读取:
#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;
}
谢谢!请原谅我与asio和网络的经验不足:)
网络是速率决定步骤。你用哪个API来驱动它几乎是不相关的。 – EJP