我有升压:: 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_cntreply_to_supervisor使用一个小sleep()电话 - 不是很好,但应该工作

其他提示

这令我的停机问题的实例,但因为你似乎是在Windows上,你可能想看看刚才的软件解决方案的只是::线程库。它是草案的C ++ 0x线程库的实现,并具有内置的死锁检测在其自己的互斥。

但最终你可能最好要求在 ASIO邮件列表这个问题。该库的作者是相当有帮助的,而该人或其他一些铁杆ASIO用户可以提供一个更好的答案在那里。

我要假设你的IO->的run()不某种循环等待ASIO完成。我也将假设你对这个ASIO操作超时。肮脏的检查方法是有状态的线程运行,并检查无论是ASIO线程超时的等待ASIO完成或者一个ASIO事件已经形成。无论哪种方式,你会设置某种变量或处理知道你的线程是“活着”和循环。然后,您的状态线程将检查每个变量/处理和检查后进行重置。

你要知道,我敢肯定还有其他的方法,但是这是来到现在就介意的...... =)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top