题
我有升压:: ASIO库的小问题。我的应用程序接收和处理数据不同步,它创建线程,在每一个上运行io_service.run()。
boost::asio::io_service io;
boost::thread_group thread_pool;
...
int cpu_cnt = get_cpu_count();
for (int i = 0; i < cpu_cnt; ++i)
{
thread_pool.create_thread( boost::bind(&run_service, &io) );
}
void run_service(boost::asio::io_service* io)
{
try
{
io->run();//make fun
}
catch(const std::exception& e)
{ //process error
}
catch(...)
{ //process error
}
}
时间的时间后,我的应用程序从该检查是我的节目活或不一些主管应用程序接收消息(横跨Windows消息系统)。如果我的应用程序不会答复的,将重新启动。这里最棘手的部分是检查,该线程运行,而不是陷入僵局。我可以张贴处理函数来io_service对象是这样的:
io.post( &reply_to_supervisor );
但这种方法只影响一个线程。 如何检查所有的线程运行,而不是僵持?
解决方案
我可能是错的,但将使用每个线程用一个io_service解决问题了吗?
另一个想法:后cpu_cnt
次reply_to_supervisor
使用一个小sleep()
电话 - 不是很好,但应该工作
其他提示
我要假设你的IO->的run()不某种循环等待ASIO完成。我也将假设你对这个ASIO操作超时。肮脏的检查方法是有状态的线程运行,并检查无论是ASIO线程超时的等待ASIO完成或者一个ASIO事件已经形成。无论哪种方式,你会设置某种变量或处理知道你的线程是“活着”和循环。然后,您的状态线程将检查每个变量/处理和检查后进行重置。
你要知道,我敢肯定还有其他的方法,但是这是来到现在就介意的...... =)
不隶属于 StackOverflow