0

我有一个非常奇怪的问题。在服务器类中,如果我评论 t1.join() 我无法从 HandleFunction 中的套接字读取任何内容。但是,如果我取消注释 t1.join(),就可以了。但我需要这个监听函数永远运行并创建一个线程来处理套接字,只要它接受一个。如果我添加加入肯定会产生一些问题。我该如何解决?提前致谢

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;
  }
}
4

1 回答 1

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()

于 2013-04-10T16:37:05.673 回答