网上有很多关于创建简单线程池的示例,例如Sample1和Sample2
我想要实现的是为不同的任务设置一个单独的线程池。例如,应用程序可能有一个线程池用于处理传入的tcp连接(让我们称之为网络池),而另一个池用于与数据库(数据库池)通信。
这些传入的tcp请求可能需要来自数据库的信息。在这种情况下,它需要从数据库池中请求那些线程执行查询,并异步返回结果。
使用boost :: asio是否有推荐的方法?是否每个池都有一个io_service实例?那些线程应该如何相互通信(使用boost)?
我理解要解释所有这些,代码不会那么短而且微不足道,但如果可能的话,某些伪代码会非常受欢迎。
谢谢!
答案 0 :(得分:2)
线程/线程池之间的通信应该通过线程安全队列。
在您的示例中,您应该有一个用于处理网络连接的网络线程池,一个用于执行网络请求的进程池,以及一个数据库连接/线程池(每个数据库一个池;每个数据库连接一个线程,但可能是您可以有多个连接到同一个数据库)。
您还需要一个线程安全队列,一个用于网络池,一个用于进程池,另一个用于每个数据库池。
假设您有一个需要从数据库获取信息的网络请求。您将在网络线程上执行时收到请求,并将请求的处理程序附加到进程队列。
进程处理程序(在进程线程中)会看到请求需要来自数据库的内容,因此它会将数据库请求以及回调处理程序附加到相应的数据库队列中。
相应的数据库线程将从数据库队列中获取请求,执行查询,返回结果,并将结果添加到回调处理程序。然后将具有数据库结果的回调处理程序对象推送到进程队列。
回调处理程序(在进程线程中)将继续执行请求,并可能打包响应消息,然后将其推送到网络队列。
然后,网络处理程序(在网络线程中)将获取响应消息并将其传递(必要时进行编码)。
可以找到线程安全队列的示例here。
虽然有点复杂,但你可以看到一个应用服务器的实现,它可以处理你所说的here,虽然它可能对你正在尝试做的事情有些过分。源代码已有相当详细的文档记录,因此您应该能够遵循它并查看它正在做什么。
我的示例使用了对asio的boost(请参阅同一系统中的TCP Connection implementation),但它不使用boost io_service作为处理程序。