【问题标题】:boost thread and socketboost 线程和套接字
【发布时间】:2013-04-02 14:38:48
【问题描述】:

我有一个非常奇怪的问题。在服务器类中,如果我评论 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;
  }
}

【问题讨论】:

    标签: boost-asio boost-thread


    【解决方案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() 被注释掉时您无法从套接字读取的原因。

    【讨论】:

    • 谢谢山姆。好像是这个问题。
    • 还有一个问题。如何将在此循环中创建的新 Socket 放入此循环外的向量中?由于套接字是不可复制的,我不能将它放入向量中。而且我不能将指针放入向量中,因为对象将被销毁并且指针将指向垃圾。
    • @cynic 套接字生命周期的惯用解决方案是使用std::shared_ptr<boost::asio::ip::tcp::socket>boost::shared_ptr<boost::asio::ip::tcp::socket>
    猜你喜欢
    • 1970-01-01
    • 2019-04-24
    • 2011-02-11
    • 2015-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-19
    相关资源
    最近更新 更多