【问题标题】:boost asio: different thread pool for different tasksboost asio:不同任务的不同线程池
【发布时间】:2014-01-31 01:16:26
【问题描述】:

网上有很多关于创建简单线程池的例子如Sample1和Sample2

我想要实现的是为不同的任务设置一个单独的线程池。例如,应用程序可能有一个线程池用于处理传入的 tcp 连接(我们称之为网络池),而另一个池用于与数据库通信(数据库池)。

这些传入的 tcp 请求可能需要来自数据库的信息。在这种情况下,它需要从数据库池中请求这些线程执行查询,并异步返回结果。

有没有推荐的使用 boost::asio 的方法?每个池都会有一个 io_service 实例吗?这些线程应该如何相互通信(使用 boost)?

我明白解释所有这些,代码不会那么短和琐碎,但如果可能的话,某种伪代码将不胜感激。

谢谢!

【问题讨论】:

  • IMO,最简单的方法是将每个拉动放在单独的 io_service 上。为了进行交流,post 在这些 io_services 之间使用函子(但请注意,您不知道哪个线程会处理您的帖子)。

标签: c++ multithreading boost boost-asio pool


【解决方案1】:

线程/线程池之间的通信应该通过线程安全队列。

在您的示例中,您应该有一个用于处理网络连接的网络线程池、一个用于执行网络请求的进程池和一个数据库连接/线程池(每个数据库一个池;每个数据库连接一个线程,但可能您可以有多个连接到同一个数据库)。

您还需要一个线程安全队列,一个用于网络池,一个用于进程池,一个用于每个数据库池。

假设您有一个需要从数据库中获取信息的网络请求。您将在网络线程上执行时收到请求,并将请求的处理程序附加到进程队列中。

进程处理程序(在进程线程中)会看到请求需要数据库中的某些内容,因此它会将数据库请求和回调处理程序附加到适当的数据库队列中。

适当的数据库线程会从数据库队列中获取请求,执行查询,取回结果,并将结果添加到回调处理程序。然后将带有数据库结果的回调处理程序对象推送到进程队列中。

回调处理程序(在进程线程中)然后将继续执行请求,并可能打包响应消息,然后将其推送到网络队列中。

网络处理程序(在网络线程中)然后会拾取响应消息并传递它(根据需要进行编码)。

一个线程安全队列的例子可以在here找到。

虽然有点复杂,但您可以看到一个应用程序服务器的实现,它可以处理您所说的here,尽管对于您正在尝试做的事情来说,这可能有点矫枉过正。源代码有很好的文档记录,因此您应该能够关注它并查看它在做什么。

我的示例将 boost 用于 asio(请参阅同一系统中的 TCP Connection implementation),但它没有将 boost io_service 用于处理程序。

【讨论】:

  • 感谢和抱歉迟到的回复。有个问题。从您的示例中,您有三个池(网络、进程、数据库)。如果只有两个池,它是否也能正常工作,这样网络池将使用您描述的相同机制通过某种线程安全消息队列直接与数据库池对话?再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-18
  • 1970-01-01
  • 2012-08-26
  • 1970-01-01
  • 2012-07-19
  • 1970-01-01
  • 2011-09-03
相关资源
最近更新 更多