Boost :: Asio线程服务器Asynchroun问题。什么都没发生

时间:2010-11-01 16:23:38

标签: c++ multithreading sockets boost boost-asio

我正在使用BoostLib创建一个服务器,所以我使用的是asio lib。

我制作了一个服务器类。

Server::Server(unsigned short port)
 : m_IOService(),
   m_Socket(m_IOService),
   m_Endpoint(boost::asio::ip::tcp::v4(), port),
   m_Acceptor(m_IOService)
{
 m_Port = port;

 m_Acceptor.open(m_Endpoint.protocol());
 m_Acceptor.bind(m_Endpoint);
}

启动功能:

void Server::Run()
{
 // Threading
 //////////////////////////////////////////////////////
   std::vector<boost::shared_ptr<boost::thread> > threads;
   for (std::size_t i = 0; i < THREAD_POOL_SIZE; ++i)
   {
  boost::shared_ptr<boost::thread> thread(new boost::thread(
     boost::bind(&boost::asio::io_service::run, &m_IOService)));
  threads.push_back(thread);
   }

   // Wait for all threads in the pool to exit.
   for (std::size_t i = 0; i < threads.size(); ++i)
  threads[i]->join();



 // Begin Client accepting
 //////////////////////////////////////////////////////

 m_Acceptor.listen();
 m_Acceptor.async_accept(
  m_FreeClient->GetSocket(),
  boost::bind(&Server::OnConnection, this, boost::asio::placeholders::error));
}

m_FreeClient是客户端类的指针。

GetSocket Defination: `boost::asio::ip::tcp::socket& GetSocket();´

我编译了&amp;启动此代码,并与一个小TestClient连接。连接就在那里,但永远不会调用Server :: OnConnection。我调试了,并设置了一个断点,但它永远不会在那里打破。

那有什么不对。 THREAD_POOL_SIZE是25。

2 个答案:

答案 0 :(得分:3)

也许这段代码不是完整版本,但是在开放套接字之前,为什么要等待所有线程退出(使用join)并不清楚。我认为你需要移动它:

   // Wait for all threads in the pool to exit.
   for (std::size_t i = 0; i < threads.size(); ++i)
  threads[i]->join();

是您在流程退出之前做的最后一件事,或至少在此之后:

 // Begin Client accepting
 //////////////////////////////////////////////////////

 m_Acceptor.listen();
 m_Acceptor.async_accept(
  m_FreeClient->GetSocket(),
  boost::bind(&Server::OnConnection, this, boost::asio::placeholders::error));

否则你的线程池永远不会有任何工作要做。

答案 1 :(得分:0)

在跳转到多个线程之前,您应该使单线程版本正常工作。乍一看,您似乎应该在调用ip::tcp::acceptor::listen()之前调用ip::tcp::acceptor::async_accept()io_service::run()