【问题标题】:boost::asio::io_service.post() background thread memory usageboost::asio::io_service.post() 后台线程内存使用
【发布时间】:2016-10-24 07:22:27
【问题描述】:

我想在后台线程中运行boost::asio::io_service.run()。所以当我需要它 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 的相关函数:

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();
}

程序运行良好。但我不想在这个(主)线程上调用异步操作。我做错了什么?

更新

我在 while(true) 循环中添加了 sleep(1sec) 并且内存不再增长。但这不是解决方案。因为如果我在 post() 之后调用 run() (即使用主线程处理句柄),甚至使用 while(true) 循环再添加五个线程,内存不会增长。那么为什么主线程比新创建的要好很多呢?我还尝试了 io_service::run 的线程池 - 没有帮助。

【问题讨论】:

  • 是什么让您认为您的内存泄漏(或不是泄漏的无限内存使用)在 Boost 代码中?调试像您的记录器客户端这样的代码是您的工作,而不是 StackOverflow。
  • 因为我用 post() 评论字符串并且内存不会增长
  • 所以中间有Boost,当logger客户端接收到字符串时,内存增长。所以记录器客户端使用内存。清除。
  • 在这个实现中,字符串无处可去。再说一遍:没有 post(),内存不会增长,而不是使用字符串。
  • 内存增长是因为循环while (true) enques handlers 比他们可以处理的快得多。内存增长不是泄漏,它只是等待执行的处理程序使用的内存。它永远追不上。

标签: c++ boost-asio boost-thread


【解决方案1】:

io_service.run 将退出,除非有待处理的操作。

因此,您的 ios_thread 将立即退出。

解决方法是使用io_service::work

另外,这样的死循环垃圾邮件

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

这不是一个好主意,也许添加一些 sleep() 来减慢它的速度并控制它。

【讨论】:

  • 但我认为运行 io_service 需要手动 stop() 所以它永远不会退出。我也试过使用 work(io_service) 并没有帮助。
  • 谢谢,我已经做了一些研究,但这对我没有帮助
  • 更新您的帖子并展示您如何使用 io_service::work,然后我们可以提供更多帮助
猜你喜欢
  • 2013-02-05
  • 2012-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多