【发布时间】:2013-03-09 02:31:04
【问题描述】:
我使用 boost:asio 和多个 io_service 来保持不同形式的阻塞 I/O 分开。例如。我有一个 io_service 用于阻塞文件 I/O,另一个用于长时间运行的 CPU 密集型任务(这可以扩展到第三个用于阻塞网络 I/O 等)一般来说,我想确保一种形式的阻塞 I/O 不能让其他 I/O 饿死。
我遇到的问题是,由于在一个 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 A 仍在处理事件时保持 io_service B 运行(因为服务 A 中的一个排队事件可能会向 B 发布一个新事件),反之亦然,同时仍确保两个 io_services 退出它们的运行() 方法,如果它们同时都没有事件?
【问题讨论】:
标签: c++ boost boost-asio