1

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

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

4

3 回答 3

2

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

另一个想法:发布cpu_cnt时间reply_to_supervisor调用使用一点sleep()- 不好,但应该工作

于 2009-01-06T14:51:12.433 回答
1

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

最终,尽管您最好在asio 邮件列表上提出这个问题。该库的作者非常有帮助,他或其他一些铁杆 asio 用户可能能够在那里提供更好的答案。

于 2009-01-05T15:38:41.233 回答
0

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

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

于 2008-12-10T17:23:19.787 回答