我正在开发一个 RPC 框架,我想使用多 io_service 设计来将执行 IO(前端)的 io_objects
与执行 RPC 工作的线程(前端)分离后端)。
前端应该是单线程的,后端应该有线程池。我正在考虑使用条件变量使前端和后端同步的设计。但是,似乎 boost::thread
和 boost::asio
不混合——即,似乎条件变量 async_wait
支持不可用.我有一个关于此事的问题 here .
我想到 io_service::post()
可能用于同步两个 io_service 对象。我在下面附上了一张图,我只是想知道我是否正确理解了 post
机制,以及这是一个明智的实现。
最佳答案
我假设您使用“a single io_service
and a thread pool calling io_service::run()
”
我还假设您的前端是单线程的,只是为了避免从多个线程写入同一个套接字的竞争条件。
可以使用 io_service::strand
实现相同的目标( tutorial )。您的前端可以通过 io_service::strand
进行 MT 同步。所有从后端到前端的post
(以及从前端到前端的处理程序,如handle_connect
等)都应该被strand
,像这样:
后端 -> 前端:
io_service.post(front_end.strand.wrap(
boost::bind(&Front_end::send_response, front_end_ptr)));
或前端 -> 前端:
socket.async_connect(endpoint, strand.wrap(
boost::bind(&Front_end::handle_connect, shared_from_this(),
boost::asio::placeholders::error)));
并且从前端到后端的所有帖子都不应该被 strand
包裹。
关于c++ - BOOST ASIO multi-io_service RPC框架设计RFC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6776779/