如何检测asio库的死锁?

时间:2008-12-10 12:58:51

标签: c++ boost boost-asio

我对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 );

但此方法仅影响一个线程。 如何检查所有线程是否正在运行而不是死锁?

3 个答案:

答案 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事件时超时。无论哪种方式,你都会设置某种变量或句柄来知道你的线程是“活着的”和循环。然后,您的状态线程将检查每个变量/句柄,并在检查后重置它们。

请注意,我确信还有其他方法,但这就是现在想到的...... =)