我使用boost:asio与多个io_services保持不同形式的阻塞I/O分离。例如。我有一个用于阻止文件I/O的io_service,另一个用于长期运行的CPU绑定任务(这可以扩展到阻止网络I/O的第三个等等)。一般来说,我想确保一种形式的阻塞I/O不能让其他人饿死。保持两个交叉通信asio io_service对象忙
我遇到的问题是,因为在一个io_service中运行的任务可以将事件发布到其他io_service(例如,一个CPU绑定的任务可能需要启动文件I/O操作,或者完成的文件I/O操作可能调用一个CPU绑定的回调),我不知道如何让两个io_services都运行,直到它们都没有事件发生。
通常与单个I/O服务,你做这样的事情:
shared_ptr<asio::io_service> io_service (new asio::io_service);
shared_ptr<asio::io_service::work> work (
new asio::io_service::work(*io_service));
// Create worker thread(s) that call io_service->run()
io_service->post(/* some event */);
work.reset();
// Join worker thread(s)
但是,如果我只是做这两个io_services,一进我没有张贴的初始事件立即结束。即使我向两者发布初始事件,如果io_service B上的初始事件在io_service A上的任务向B发布新事件之前完成,io_service B将提前结束。
我怎样才能保持io_service对象B上运行,而io_service对象A仍然处理事件(因为在服务质量上排队的事件之一可能会发布一个新的事件B),反之亦然,同时还要确保两个io_services退出了run()方法是否同时出现两个事件?
+1好方案泰勒 – 2013-03-09 02:37:03