代码之家  ›  专栏  ›  技术社区  ›  Fire Lancer

boost::asio多线程问题

  •  3
  • Fire Lancer  · 技术社区  · 15 年前

    我有一个服务器 boost::asio

    服务器可以分为几个“区域”,套接字从连接区域开始,一旦连接到客户端,就被移动到身份验证区域(即登录或注册),然后根据客户端的操作在服务器的其他各个部分之间移动。

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

    但是我不知道该怎么做。我考虑过为每个组件提供自己的io峎服务,这样它就可以使用它想要的任何线程,但是套接字区域绑定到io峎服务,我不确定如何将客户端套接字从一个组件移动到另一个组件。

    2 回复  |  直到 15 年前
        1
  •  4
  •   deft_code    15 年前

    你可以用 asio::io_service::strand io_service 像往常一样。一旦您建立了与客户机的连接,从那里开始用 io_service::strand . 每个客户一股。这基本上保证了从客户端的角度来看它是单线程的。

        2
  •  2
  •   Cœur Gustavo Armenta    6 年前

    首先,我建议考虑 多过程方法 相反,它是一个非常简单、易于推理和调试、易于扩展的体系结构。

    Voldemort (持续的)或 Redis (集合和列表-非常酷,我真的很期待一个持久的版本), memcached (不可靠)或类似的)-更容易扩展。

    例如,您可以使用一个侦听器线程来平衡使用UNIX的多个服务器进程 sendmsg() 传递描述符。这种体系结构可以很容易地移植到带有硬件负载平衡器的多机器上。

    海报上很有意思。可以是,您可以通过消息队列来完成这一切,而不是锁定。原因是磁盘IO(即使有SSD之类的)和网络是真正的瓶颈,而且没有必要对CPU那么小心;线程之间传递消息的延迟并不是什么大问题,而且根据您的操作系统,在SMP设置中,线程(或进程)可以调度到不同的内核。

    monologue 我们的一个主人说的。