【问题标题】:How to detect deadlock whith Asio library?如何检测 Asio 库的死锁?
【发布时间】:2008-12-10 12:58:50
【问题描述】:

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

但是这种方法只影响一个线程。 如何检查所有线程都在运行并且没有死锁?

【问题讨论】:

    标签: c++ boost boost-asio


    【解决方案1】:

    我可能错了,但是每个线程使用 io_service 会解决您的问题吗?

    另一个想法:发布 cpu_cntreply_to_supervisor 调用使用一点 sleep() - 不好,但应该可以工作

    【讨论】:

      【解决方案2】:

      这让我觉得这是Halting Problem 的一个实例,但由于您似乎在Windows 上,您可能需要查看Just Software Solution 的just::thread 库。它是草稿 C++0x 线程库的实现,并在其自己的互斥锁中内置了死锁检测。

      最终,尽管您最好在asio mailing list 上提出这个问题。该库的作者非常乐于助人,他或其他一些铁杆 asio 用户可能能够在那里提供更好的答案。

      【讨论】:

        【解决方案3】:

        我将假设您的 io->run() 执行某种循环以等待 asio 完成。我还将假设您对此 asio 操作有超时。一种肮脏的检查方法是运行状态线程并检查 asio 线程是否在等待 asio 完成时超时或是否已发布 asio 事件。无论哪种方式,您都会设置某种变量或句柄来知道您的线程是“活动的”并且正在循环。然后,您的状态线程将检查每个变量/句柄并在检查后重置它们。

        请注意,我敢肯定还有其他方法,但这是我现在想到的... =)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-14
          • 2019-04-26
          相关资源
          最近更新 更多