提升异步ioservice,缓慢执行linux上的一个线程

时间:2013-09-11 21:07:16

标签: c++ boost boost-asio

我在我的应用程序中使用boost asio。我创建了两个ioservices。一个用于处理UDP套接字异步操作,另一个用于处理tcp异步操作。在通过udp socket接收数据时,基于数据我将打开一个tcp连接到其他服务器。我在所有地方都使用异步函数调用。

下面是高级伪代码。

int g_requestID ;


// boost async_recv handler
class UDPSocket
{
    UDPSocket::OnDataReceived(const boost::system::error_code& error, std::size_t bytes_transferred
    {
       TCPSession *pSesson = new TCPSession() ;
       g_requestID = pSesson->sendDataOverTCP(data);
    }
}

// TCP Response Callback
void tcpResponse(int reqId)
{
   if (g_requestID == reqId)
   {
      // received response for the request 
   }
}


class TCPSession
{
   boost::asio::streambuf request_;
   static int requestId ;
   boost::tcp::socket m_socket ;
   int currentsessionId = requestId ++ ;

   int sendDataOverTCP(char* address, char* data)
   {
       m_socket.async_resolve()
       return currentsessionId++ ;
   }

   void handle_resolve(const boost::system::error_code& err, tcp::resolver::iterator endpoint_iterator)
   {
      if (!err)
      {
         boost::asio::async_connect(m_socket, endpoint_iterator, boost::bind(&client::handle_connect, this, boost::asio::placeholders::error));
      }
      else
      {
         std::cout << "Error: " << err.message() << "\n";
      }
   }

   void handle_connect(const boost::system::error_code& err)
   {
       if (!err)
       {
          // The connection was successful. Send the request.
          boost::asio::async_write(m_socket, request_, boost::bind(&client::handle_write, this, boost::asio::placeholders::error));
       }
       else
       {
          std::cout << "Error: " << err.message() << "\n";
       }
   }

   void handle_write(const boost::system::error_code& err)
   {
      if (!err)
      {
          boost::asio::async_read_until(socket_, response_, "\r\n", boost::bind(&client::handle_receive, this, boost::asio::placeholders::error));
      }
      else
      {
         std::cout << "Error: " << err.message() << "\n";
      }
   }

   void handle_receive(const boost::system::error_code& err)
   {
      if (!err)
      {
           tcpResponse(currentsessionId) ;
      }
      else
      {
          std::cout << "Error: " << err << "\n";
      }
   } 
}

现在来我的问题。在tcpResponse函数中,g_requestID包含垃圾值。当我通过添加日志语句调试时,我发现在收到tcpResponse回调后返回sendDataOverTCP。在sendDataOverTcp中,我只调用async_resolve。它应该立即返回。但事实并非如此。

调试后,我发现了以下行为。 async_resolve按预期工作。它立即返回。但sendDataOverTCP仅在tcpResponse回调后返回。

任何人都可以为我提供解决方案,是不是因为某些线程安排?

相同的代码在Windows上正常工作。在linux上,我正面临这个问题。

我使用虚拟盒

在ubuntu 13.04上使用boost 1.53.0

0 个答案:

没有答案