我已經做了一個服務器,從客戶端讀取數據,我使用boost :: asio async_read_some讀取數據,並且我已經創建了一個處理函數,並且在這裏_ioService-> poll()將運行事件處理循環來執行就緒處理程序。在處理程序_handleAsyncReceive中,我取消了在receiveDataAsync中分配的buf。緩衝區大小爲500 代碼如下:使用boost :: asio時的高CPU和內存消耗async_read_some
bool
TCPSocket::receiveDataAsync(unsigned int bufferSize)
{
char *buf = new char[bufferSize + 1];
try
{
_tcpSocket->async_read_some(boost::asio::buffer((void*)buf, bufferSize),
boost::bind(&TCPSocket::_handleAsyncReceive,
this,
buf,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
_ioService->poll();
}
catch (std::exception& e)
{
LOG_ERROR("Error Receiving Data Asynchronously");
LOG_ERROR(e.what());
delete [] buf;
return false;
}
//we dont delete buf here as it will be deleted by callback _handleAsyncReceive
return true;
}
void
TCPSocket::_handleAsyncReceive(char *buf, const boost::system::error_code& ec, size_t size)
{
if(ec)
{
LOG_ERROR ("Error occurred while sending data Asynchronously.");
LOG_ERROR (ec.message());
}
else if (size > 0)
{
buf[size] = '\0';
LOG_DEBUG("Deleting Buffer");
emit _asyncDataReceivedSignal(QString::fromLocal8Bit(buf));
}
delete [] buf;
}
這裏的問題是緩衝區以更快的速率比較釋放這樣的內存使用率會高以指數的速度和在某個時候,它會消耗分配所有的內存和系統都會卡住。 CPU使用率也將在90%左右。我如何減少內存和CPU消耗?