我对boost :: 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 );
但此方法仅影响一个线程。 如何检查所有线程是否正在运行而不是死锁?
答案 0 :(得分:2)
我可能错了,但每个线程使用一个io_service会解决你的问题吗?
另一个想法:发布使用cpu_cnt
的{{1}}次reply_to_supervisor
次调用 - 不太好,但应该有效
答案 1 :(得分:1)
这是Halting Problem的一个实例,但由于您似乎在Windows上,因此您可能需要查看Just Software Solution的just::thread库。它是草案C ++ 0x线程库的一个实现,并在其自己的互斥锁中内置了死锁检测。
最终,你可能最好在asio mailing list上提出这个问题。该图书馆的作者非常有帮助,他或其他一些铁杆asio用户可能能够在那里提供更好的答案。
答案 2 :(得分:0)
我将假设您的io-&gt; run()执行某种循环以等待asio完成。我也假设你在这个asio操作上有一个超时。检查的脏方法是运行状态线程,并检查asio线程是否在等待asio完成或已发布asio事件时超时。无论哪种方式,你都会设置某种变量或句柄来知道你的线程是“活着的”和循环。然后,您的状态线程将检查每个变量/句柄,并在检查后重置它们。
请注意,我确信还有其他方法,但这就是现在想到的...... =)