1

我正在研究 RPC 框架,我想使用多 io_service 设计将io_objects执行 IO(前端)的线程与执行 RPC 工作的线程(后端)分离。

前端应该是单线程的,后端应该有一个线程池。我正在考虑使用条件变量使前端和后端同步的设计。但是,似乎boost::threadboost::asio没有混合——即,似乎条件变量async_wait支持不可用。我在这里有一个关于这个问题的问题。

我突然想到io_service::post()可以用来同步两个 io_service 对象。我在下面附上了一张图表,我只想知道我post是否正确理解了机制,并且天气这是一个明智的实现。

rpc系统实现

4

2 回答 2

2

我假设您使用“单线程io_service池调用io_service::run()

另外我假设你的前端是单线程的,只是为了避免从多个线程写入同一个套接字的竞争条件。

io_service::strand使用(教程)可以实现相同的目标。您的前端可以通过 MT 同步io_service::strand。所有posts从后端到前端(以及从前端到前端的处理程序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.

于 2011-07-22T16:43:58.490 回答
1

如果您的后端是调用任何io_service::run(), io_service::run_one(), io_service::poll(), io_service::poll_one()函数的线程池,并且您的处理程序需要访问共享资源,那么您仍然必须注意以某种方式将这些共享资源锁定在处理程序本身中。

鉴于问题中发布的信息数量有限,鉴于上述警告,我认为这会很好。

但是,在发布时,设置必要的完成端口和等待会产生一些可衡量的开销——开销可以避免使用后端“队列”的不同实现。

在不知道您需要完成的具体细节的情况下,我建议您查看管道的线程构建块,或者更简单地查看并发队列

于 2011-07-21T17:39:30.973 回答