首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BOOST ASIO多io_服务RPC框架设计

BOOST ASIO多io_服务RPC框架设计
EN

Stack Overflow用户
提问于 2011-07-21 21:26:23
回答 2查看 2.3K关注 0票数 1

我在一个远程过程调用框架上工作,我想使用一种多io_service设计来将执行IO的io_objects (前端)与执行远程过程调用工作的线程(后端)解耦。

前端应该是单线程的,后端应该有一个线程池。我正在考虑一种设计,让前端和后端使用条件变量进行同步。然而,boost::threadboost::asio似乎并没有结合在一起--也就是说,条件变量async_wait支持似乎不可用。我有一个关于这个问题的公开问题,here

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

EN

回答 2

Stack Overflow用户

发布于 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包装的,类似于:

后端->前端:

代码语言:javascript
复制
io_service.post(front_end.strand.wrap(
    boost::bind(&Front_end::send_response, front_end_ptr)));

或前端->前端:

代码语言:javascript
复制
socket.async_connect(endpoint, strand.wrap(
    boost::bind(&Front_end::handle_connect, shared_from_this(), 
    boost::asio::placeholders::error)));

而且从前端到后端的所有帖子都不应该被strand包装。

票数 2
EN

Stack Overflow用户

发布于 2011-07-22 01:39:31

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

考虑到问题中张贴的有限信息量,我假设考虑到上面的警告,这将很好地工作。

然而,在发布时,设置必要的完成端口和等待有一些可测量的开销--开销您可以避免使用后端“队列”的不同实现。

在不知道需要完成哪些任务的确切细节的情况下,我建议您查看pipelines的线程构建块,或者更简单地查看concurrent queue

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6776779

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档