我有一个非常奇怪的问题。在服务器类中,如果我注释t1.join(),我无法从HandleFunction中的套接字读取任何内容。但如果我取消注释t1.join(),那就行了。 但我需要这个listen函数永远运行并创建一个线程来处理套接字,只要它接受它。如果我添加连接肯定会产生一些问题。 我该如何解决? 提前谢谢
class server
{
io_service;
acceptor;
void listen()
{
for(;;)
{
boost::asio::ip::tcp::socket socket(io_service);
socketPtr = &socket;
acceptor.accept(socket);
HandleClass objHandleClass;
boost::thread t1(boost::bind(&HandleClass::HandleFunction, &objHandleClass, boost::ref(socketptr)));
//t1.join();
}
}
}
int main()
{
server objServer;
objServer.listen();
}
class HandleClass
{
HandleFunction(socket* socketPtr)
{
//read from this socket;
}
}
答案 0 :(得分:1)
在void listen()
for(;;)
{
boost::asio::ip::tcp::socket socket(io_service);
socketPtr = &socket;
acceptor.accept(socket);
HandleClass objHandleClass;
boost::thread t1(boost::bind(&HandleClass::HandleFunction, &objHandleClass, boost::ref(socketptr)));
//t1.join();
}
您的socket
对象将超出范围并在此循环的每次迭代中被销毁,这就是在t1.join()
被注释掉时无法从套接字读取的原因。