运行 个带有 boost 和 asio 的线程
Run threads with boost and asio
简介
我正在尝试创建一个线程来从套接字接收数据。
代码
void ClientTcp::read_handler(tcp::socket s){
for(;;){
char buffer[max_buffr];
boost::system::error_code error;
size_t length = s.read_some(boost::asio::buffer(buffer), error);
if (error == boost::asio::error::eof)
break; // Connection closed cleanly by peer.
else if (error)
throw boost::system::system_error(error); // Some other error.
buffer[length] = '[=11=]';
std::cout << "-> " << buffer << std::endl;
}
}
void ClientTcp::run(){
tcp::socket s(io_service_);
tcp::resolver resolver(io_service_);
boost::asio::connect(s, resolver.resolve({ip_, port_}));
boost::thread read_th(read_handler, std::move(s));
std::string message;
for(;;){
std::cin >> message;
boost::asio::write(s, boost::asio::buffer(message, message.size()));
}
read_th.join();
}
问题
这一行 boost::thread read_th(read_handler, std::move(s));
有一个我无法理解的错误。
错误
no matching function for call to boost::thread::thread(<unresolved overloaded function type,
std::remove_reference<boost::asio::basic_stream_socket<boost::asio::ip::tcp>&>::type)
主要问题
我如何从 class 方法启动线程?
回答错误的问题:你会使用boost::bind
boost::thread read_th(boost::bind(&ClientTcp::read_handler, this, std::move(s)));
但是你肯定不想那样做。每个异步操作使用一个线程根本不起作用。
Boost 让您无需额外线程即可实现异步。只需使用 async_*
函数而不是您使用的函数
正在使用:
async_read_some
async_write
.
别忘了 运行 io_service::run()
.
boost::thread
构造函数似乎无法执行其参数的 "perfect forwarding"(并且您不能使用 bind
,原因在对 @sehe 回答的评论中描述) .
然而,作为 C++11 的一部分,std::thread
确实正确地转发了参数,因此编译如下:
#include <boost/asio.hpp>
#include <thread>
using namespace boost::asio;
void read_handler(ip::tcp::socket && s)
{
}
int main()
{
io_service io;
ip::tcp::socket s(io);
std::thread read_th(read_handler, std::move(s));
}
请注意,如果 read_handler
是非静态成员函数(如您的问题),您应该将其与对象实例绑定:std::thread(&ClientTcp::read_handler, this, std::move(s));
(当然要考虑对象的生命周期,还有@sehe提出的设计注意事项。)
简介
我正在尝试创建一个线程来从套接字接收数据。
代码
void ClientTcp::read_handler(tcp::socket s){
for(;;){
char buffer[max_buffr];
boost::system::error_code error;
size_t length = s.read_some(boost::asio::buffer(buffer), error);
if (error == boost::asio::error::eof)
break; // Connection closed cleanly by peer.
else if (error)
throw boost::system::system_error(error); // Some other error.
buffer[length] = '[=11=]';
std::cout << "-> " << buffer << std::endl;
}
}
void ClientTcp::run(){
tcp::socket s(io_service_);
tcp::resolver resolver(io_service_);
boost::asio::connect(s, resolver.resolve({ip_, port_}));
boost::thread read_th(read_handler, std::move(s));
std::string message;
for(;;){
std::cin >> message;
boost::asio::write(s, boost::asio::buffer(message, message.size()));
}
read_th.join();
}
问题
这一行 boost::thread read_th(read_handler, std::move(s));
有一个我无法理解的错误。
错误
no matching function for call to boost::thread::thread(<unresolved overloaded function type,
std::remove_reference<boost::asio::basic_stream_socket<boost::asio::ip::tcp>&>::type)
主要问题 我如何从 class 方法启动线程?
回答错误的问题:你会使用boost::bind
boost::thread read_th(boost::bind(&ClientTcp::read_handler, this, std::move(s)));
但是你肯定不想那样做。每个异步操作使用一个线程根本不起作用。
Boost 让您无需额外线程即可实现异步。只需使用 async_*
函数而不是您使用的函数
正在使用:
async_read_some
async_write
.
别忘了 运行 io_service::run()
.
boost::thread
构造函数似乎无法执行其参数的 "perfect forwarding"(并且您不能使用 bind
,原因在对 @sehe 回答的评论中描述) .
然而,作为 C++11 的一部分,std::thread
确实正确地转发了参数,因此编译如下:
#include <boost/asio.hpp>
#include <thread>
using namespace boost::asio;
void read_handler(ip::tcp::socket && s)
{
}
int main()
{
io_service io;
ip::tcp::socket s(io);
std::thread read_th(read_handler, std::move(s));
}
请注意,如果 read_handler
是非静态成员函数(如您的问题),您应该将其与对象实例绑定:std::thread(&ClientTcp::read_handler, this, std::move(s));
(当然要考虑对象的生命周期,还有@sehe提出的设计注意事项。)