boost :: asio多线程问题

时间:2009-12-08 17:09:12

标签: c++ multithreading boost-asio

我有一台使用boost::asio的服务器,我想制作多线程。

服务器可以分解为几个“区域”,套接字从连接区域开始,然后一旦连接到客户端移动到认证区域(即登录或注册),然后在各个其他部分之间移动服务器根据客户端的行为来处理。

我并不特别想在单个io_service上为所有套接字使用线程池,因为需要大量的锁,特别是在与公共资源进行大量交互的区域。但是,我希望为每个服务器组件(比如说身份验证)提供自己的线程。

但是我不确定如何做到这一点。我考虑过为每个组件提供自己的io_service的想法,所以它可以使用它想要的任何线程,但是套接字区域与io_service绑定,我不知道如何将客户端套接字从一个组件移动到另一个组件。

2 个答案:

答案 0 :(得分:4)

您可以使用asio::io_service::strand解决此问题。像往常一样为io_service创建一个线程池。一旦与客户端建立连接,就可以使用io_service::strand包装所有异步调用。每个客户一条链。这基本上保证了从客户端的角度来看它是单线程的。

答案 1 :(得分:2)

首先,我主张考虑采用多进程方法;它是一个非常简单,易于推理和调试,并且易于扩展的架构。

服务器设计,您可以在其中水平扩展 - 服务器的多个实例,其中每个服务器中的状态不需要在服务器之间共享(例如,共享状态可以位于公共数据库中(SQL,Voldemort(持久性) )或Redis(设置和列表 - 非常酷,我对持久版本感到非常兴奋),memcached(不可靠)或类似的东西 - 更容易扩展。

例如,您可以使用单个侦听器线程在使用UNIX sendmsg()传输描述符的多个服务器进程之间进行平衡。这种架构可以直接用硬件负载平衡器迁移到多台机器。

海报中的区域想法非常有趣。可能是,您可以通过消息队列完成所有操作,而不是锁定。磁盘IO的原因 - 即使是SSD等 - 以及网络是真正的瓶颈而且没有必要小心CPU;在线程之间传递的消息的延迟并不是什么大问题,并且根据您的操作系统,线程(或进程)可以在SMP设置中调度到不同的核心。

但最终,一旦达到饱和状态,要扩大区域构思,您需要更快的内核而不是更多内核。这是来自我们的一位主持人的有趣monologue