我在一个远程过程调用框架上工作,我想使用一种多io_service设计来将执行IO的io_objects (前端)与执行远程过程调用工作的线程(后端)解耦。
前端应该是单线程的,后端应该有一个线程池。我正在考虑一种设计,让前端和后端使用条件变量进行同步。然而,boost::thread和boost::asio似乎并没有结合在一起--也就是说,条件变量async_wait支持似乎不可用。我有一个关于这个问题的公开问题,here。
我突然想到可以使用io_service::post()来同步这两个io_service对象。我在下面附上了一张图表,我只是想知道我是否正确地理解了post机制,以及这是否是一个明智的实现。

发布于 2011-07-23 00:43:58
我假设你用"a single io_service and a thread pool calling io_service::run()“
另外,我假设您的前端是单线程的,以避免从多个线程向同一套接字写入竞争条件。
同样的目标可以使用io_service::strand (tutorial)来实现,.Your前端可以通过io_service::strand进行MT同步。从后端到前端的所有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-22 01:39:31
如果您的后端是一个调用任何io_service::run(), io_service::run_one(), io_service::poll(), io_service::poll_one()函数的线程池,并且您的处理程序需要访问共享资源,那么您仍然需要注意以某种方式将这些共享资源锁定在处理程序本身中。
考虑到问题中张贴的有限信息量,我假设考虑到上面的警告,这将很好地工作。
然而,在发布时,设置必要的完成端口和等待有一些可测量的开销--开销您可以避免使用后端“队列”的不同实现。
在不知道需要完成哪些任务的确切细节的情况下,我建议您查看pipelines的线程构建块,或者更简单地查看concurrent queue。
https://stackoverflow.com/questions/6776779
复制相似问题