如何编程连接池?

时间:2010-05-07 18:53:26

标签: c++ design-patterns boost-asio

是否有已知的实现连接池的算法?如果不是已知的算法是什么,他们的权衡是什么? 在设计和编程连接池时,常见的设计模式是什么? 是否有任何代码示例使用boost.asio实现连接池?
使用连接池来保持连接(而不是http)是个好主意吗? 线程如何与连接池相关?你什么时候需要一个新线程?

1 个答案:

答案 0 :(得分:18)

如果您正在寻找纯线程池策略(可能是连接或任何资源),有两种简单的方法即: -

  1. 半同步/半异步模型(通常使用消息队列传递信息)。

  2. 领导者/追随者模型(通常使用请求队列传递信息)。

  3. 第一种方法是这样的: -

    • 您创建一个线程池 处理资源。通常这个尺寸 (线程数)需要 可配置的。称这些线程 '的'。
    • 然后创建一个主线程 将工作分发给 工作人员主题。应用程序将任务调度为 消息 到主线程。
    • 主线程也是如此 所选工作人员的消息Q. 线程和 Worker 线程将自己从 池。选择和删除 工作人员线程需要同步。
    • 工作人员完成后 任务,它返回到线程池。

    主线程本身可以使用 FCFS 优先方式获取的任务。这取决于您的实施。

    第二个模型(领导/追随者)是这样的: -

    • 创建一个线程池。最初全部 是工人。然后选一个 领导者,自动休息 - 成为粉丝。注意选举 领导者必须同步。
    • 将要处理的所有数据放在a上 单个请求Q
    • 线程池 Leader 出列 任务。然后立即 选择新领导并开始执行任务。
    • 新领导人接下来 任务。

    也可能有其他方法,但上面列出的方法很简单,适用于大多数用例。

    半同步/半异步主要弱点: -

    • 更高的上下文切换, 同步和数据复制 开销。

    Leader / Follwers Major Weakness: -

    • 实施复杂性 线程池中的领导者选举。

    现在您可以自己决定更正确的方法。 HTH,