我想在后台线程中运行boost::asio::io_service.run()
。所以当我需要post()函数进入。
这是主要功能:
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)循环中添加了睡眠(1秒)并且内存不再增长。但这不是解决方案。因为如果我在post()之后调用run()(即使用主线程处理句柄),甚至添加五个线程,而while(true)循环内存不会增长。那么为什么主线程比新创建的好呢?我也尝试过io_service :: run的线程池 - 没有帮助。
答案 0 :(得分:2)
因此,您的ios_thread将立即退出。
解决方案是使用coincidence。
此外,像这样的无限循环垃圾邮件
while (true)
logg->add_string(message);
不是一个好主意,可能会添加一些睡眠(),以减慢它的速度并使其受到控制。