我想在後臺線程運行boost::asio::io_service.run()
。所以當我需要post()func時。的boost :: ASIO :: io_service.post()後臺線程的內存使用情況
這是主要的FUNC:
int main(int /*argc*/, char** /*argv*/)
{
std::string message = "hello";
logg = new logger_client(filename,ip,13666);
logg->start();
while (true)
logg->add_string(message);
return 0;
}
而且從logger_client一些相關funcs中:
std::auto_ptr<boost::asio::io_service::work> work;
logger_client::logger_client(std::string& filename,std::string& ip, uint16_t port) : work(new boost::asio::io_service::work(io_service))
{
}
void logger_client::start()
{
ios_thread = new boost::thread(boost::bind(&io_service.run,&io_service));
}
void print_nothing()
{
printf("%s\n","lie");
}
void logger_client::add_string(std::string& message)
{
io_service.post(boost::bind(print_nothing));
//io_service.post(strand->wrap(boost::bind(&logger_client::add_string_imp,this,message)));
//io_service.run();
}
當我運行它,我的程序的2Gb吃不到一分鐘。如果我刪除無盡的工作,並改變爲:
void logger_client::add_string(std::string& message)
{
io_service.post(boost::bind(print_nothing));
//io_service.post(strand->wrap(boost::bind(&logger_client::add_string_imp,this,message)));
io_service.run();
}
程序工作得很好。但我不想在這個(主)線程上調用異步操作。我究竟做錯了什麼?
UPDATE
我加了睡眠(1秒)的同時(true)循環和內存不再增長。但這不是一個解決方案。因爲如果我在post()之後調用run()(即使用主線程來處理句柄),甚至在while(true)循環中增加五個線程,內存不會增長。那麼爲什麼主線程比新創建的好多了?我也嘗試過io_service :: run的線程池 - 沒有幫助。
是什麼讓你覺得你的內存泄漏(或無界的內存使用,是不是泄漏)是在加速的代碼?像你的記錄器客戶端調試代碼是你的工作而不是StackOverflow。 –
職高我評論字符串後()和內存不長 – alebaster
所以,你必須在中間升壓,當記錄器客戶端接收字符串,存儲的增長。所以記錄器客戶端使用內存。明確。 –