TDL*_*TDL 5 c++ multithreading boost pool boost-asio
网上有很多关于创建简单线程池的例子,例如Sample1和Sample2
我想要实现的是为不同的任务创建一个单独的线程池.例如,应用程序可能有一个线程池用于处理传入的tcp连接(让我们称之为网络池),而另一个池用于与数据库(数据库池)通信.
这些传入的tcp请求可能需要来自数据库的信息.在这种情况下,它需要从数据库池中请求那些线程执行查询,并异步返回结果.
是否有推荐的方法使用boost :: asio?是否每个池都有一个io_service实例?那些线程应该如何相互通信(使用boost)?
我理解要解释所有这些,代码不会那么短而微不足道,但如果可能的话,某些伪代码将会非常受欢迎.
谢谢!
线程/线程池之间的通信应该通过线程安全队列。
在您的示例中,您应该有一个用于处理网络连接的网络线程池,一个用于执行网络请求的进程池,以及一个数据库连接/线程池(每个数据库一个池;每个数据库连接一个线程,但可能您可以有多个连接到同一数据库)。
您还需要一个线程安全队列,一个用于网络池,一个用于进程池,一个用于每个数据库池。
假设您有一个网络请求,需要从数据库获取信息。您将在网络线程上执行时接收请求,并将请求的处理程序附加到进程队列中。
进程处理程序(在进程线程中)会发现请求需要数据库中的某些内容,因此它将数据库请求以及回调处理程序附加到适当的数据库队列中。
适当的数据库线程将从数据库队列中获取请求,执行查询,获取结果,并将结果添加到回调处理程序中。然后,带有数据库结果的回调处理程序对象将被推送到进程队列中。
然后,回调处理程序(在进程线程中)将继续执行请求,并可能打包一条响应消息,然后将其推送到网络队列中。
然后,网络处理程序(在网络线程中)将拾取响应消息并传递它(根据需要进行编码)。
可以在此处找到线程安全队列的示例。
虽然有点复杂,但您可以看到一个应用程序服务器的实现,它可以处理您在这里谈论的内容,尽管它对于您想要做的事情来说可能有点过头了。源代码有很好的文档记录,因此您应该能够遵循它并了解它在做什么。
我的示例使用 boost 作为 asio(请参阅同一系统中的TCP 连接实现),但它不使用 boost io_service 作为处理程序。
| 归档时间: |
|
| 查看次数: |
998 次 |
| 最近记录: |