2016-06-22 52 views
0

我想在後臺線程運行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的線程池 - 沒有幫助。

+0

是什麼讓你覺得你的內存泄漏(或無界的內存使用,是不是泄漏)是在加速的代碼?像你的記錄器客戶端調試代碼是你的工作而不是StackOverflow。 –

+0

職高我評論字符串後()和內存不長 – alebaster

+0

所以,你必須在中間升壓,當記錄器客戶端接收字符串,存儲的增長。所以記錄器客戶端使用內存。明確。 –

回答

2

io_service.run將退出除非有未完成的操作。

因此,您ios_thread將立即退出。

的解決方案是使用io_service::work

此外,像這樣

while (true) 
     logg->add_string(message); 

無限循環的垃圾郵件是不是一個好主意,也許增加一些睡眠(),慢下來一點,並控制住。

+0

但我認爲運行io_service比需要手動停止(),所以它永遠不會退出。此外,我嘗試使用工作(io_service),並沒有幫助。 – alebaster

+0

閱讀此:http://stackoverflow.com/questions/17156541/why-do-we-need-to-use-boostasioio-servicework –

+0

謝謝你,我已經做了一點研究,但這不幫我 – alebaster