boost-asio:用于不同任务的不同线程池
boost asio: different thread pool for different tasks
网上有很多关于创建简单线程池的例子,例如Sample1和Sample2
不过,我想要实现的是为不同的任务提供一个单独的线程池。例如,应用程序可能有一个线程池,用于处理传入的tcp连接(让我们称之为网络池),而另一个池用于与数据库对话(数据库池)。
这些传入的tcp请求可能需要来自数据库的信息。在这种情况下,它需要请求数据库池中的那个些线程执行查询,并异步返回结果。
有没有推荐的使用boost::asio的方法?它会为每个池提供一个io_service实例吗?这些线程应该如何相互通信(使用boost)?
我理解解释所有这些,代码不会那么简短和琐碎,但如果可能的话,我们将非常感谢某种伪代码。
谢谢!
线程/线程池之间的通信应该通过线程安全队列。
在您的示例中,您应该有一个用于处理网络连接的网络线程池、一个用于执行网络请求的进程池和一个数据库连接/线程池(每个数据库一个池;每个数据库连接一个线程,但您可能有多个到同一数据库的连接)。
您还需要一个线程安全的队列,一个用于网络池、一个用于进程池和每个数据库池。
假设您有一个网络请求,需要从数据库中获取信息。您将在网络线程上执行时收到请求,并将请求的处理程序附加到进程队列中。
进程处理程序(在进程线程中)会发现请求需要来自数据库的东西,因此它会将数据库请求和回调处理程序附加到适当的数据库队列中。
适当的数据库线程将从数据库队列中获取请求,执行查询,获取结果,并将结果添加到回调处理程序中。然后,带有数据库结果的回调处理程序对象将被推送到进程队列中。
回调处理程序(在进程线程中)将继续执行请求,并可能打包一条响应消息,然后将其推送到网络队列中。
然后,网络处理程序(在网络线程中)将接收响应消息并传递它(根据需要进行编码)。
这里可以找到线程安全队列的示例。
尽管有点复杂,但你可以看到一个应用程序服务器的实现,它可以处理你在这里谈论的内容,尽管它可能对你试图做的事情来说有些过头了。源代码有很好的文档记录,所以你应该能够跟踪它,看看它在做什么。
我的示例对asio使用boost(请参阅同一系统中的TCP连接实现),但对处理程序不使用boost io_service。
- 如何创建线程序列以按照启动顺序执行任务?
- C++一个线程如何正确通信其任务已完成?
- 对于同一任务,线程的等待时间在 0 到 30000 微秒之间系统地切换
- 在iOS设备上执行并发任务时如何设置正确的线程数?
- 如何从父线程中提取 pthread 的任务 id(tid)
- 根据硬件并发性将任务平均划分为线程
- C++生产者使用者中,同一使用者线程会抓取所有任务
- 正在执行 omp 任务的线程数
- 您可以在 OpenMP 中将特定线程 ID 分组到唯一的任务组中吗?
- 是boost :: asio :: thread_pool线程在多个线程上发布任务时的安全性
- asio::strand 上的任务在单个线程上运行
- 如何在C++中创建高效的多线程任务计划程序
- 如何在多个线程上正确分发任务
- 在多线程中调度任务
- Poco任务管理器/Boost线程混合和匹配
- 将执行从一个线程移动到另一个线程,以实现任务并行性并在将来调用
- 使用C 多任务.线程或不同的设计
- 如何处理任务,同时剩余的线程完成工作
- 多线程任务总体进度报告的设计模式
- 在OpenMP中屈服于其他线程/任务