2014-01-12 61 views
5

有关于创建一个简单的线程池,如Sample1Sample2ASIO提升:不同的线程池不同的任务

我想,虽然实现的净许多例子就是有不同的任务一个单独的线程池。例如,应用程序可能有一个用于处理传入TCP连接的线程池(我们称之为网络池),另一个池用于与数据库(数据库池)交谈。

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

是否有推荐的方法来使用boost :: asio?它会为每个池有一个io_service实例吗?那些线程应该如何相互通信(使用boost)?

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

谢谢!

+2

国际海事组织,最简单的方法是把每个拉一个单独的'io_service'。为了沟通,这些'io_service'之间的'后'函数(注意,不能知道哪个线程会处理你的文章)。 –

回答

2

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

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

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

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

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

适当的数据库线程将从数据库队列中提取请求,执行查询,返回结果并将结果添加到回调处理程序。包含数据库结果的回调处理程序对象将被推送到进程队列中。

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

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

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

虽然有点复杂,但您可以看到一个应用服务器的实现,它可以处理您正在讨论的内容here,尽管它可能对您正在尝试执行的操作过度。源代码有相当详细的文档,所以你应该能够关注它并看看它在做什么。

我的示例对asio使用boost(请参阅同一系统中的TCP Connection implementation),但它不使用boost io_service作为处理程序。

+0

谢谢你,对于迟到的回复感到抱歉。有一个问题。在你的例子中,你有三个池(网络,进程,数据库)。如果只有两个池,那么它是否也能正常工作,以便网络池将通过某种线程安全消息队列直接与数据库池进行通信,使用您描述的相同机制?再次感谢。 – TDL