Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ boost asio:不同任务的不同线程池_C++_Multithreading_Boost_Boost Asio_Pool - Fatal编程技术网

C++ boost asio:不同任务的不同线程池

C++ boost asio:不同任务的不同线程池,c++,multithreading,boost,boost-asio,pool,C++,Multithreading,Boost,Boost Asio,Pool,网上有很多关于创建简单线程池的例子,比如和 不过,我想要实现的是为不同的任务提供一个单独的线程池。例如,应用程序可能有一个线程池用于处理传入的tcp连接(让我们称之为网络池),而另一个线程池用于与数据库通信(数据库池) 这些传入的tcp请求可能需要来自数据库的信息。在这种情况下,需要请求数据库池中的线程执行查询,并异步返回结果 使用boost::asio有没有推荐的方法?是否每个池都有一个io_服务实例?这些线程应该如何相互通信(使用boost) 我明白要解释所有这些,代码不会那么短和琐碎,但如

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

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

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

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

我明白要解释所有这些,代码不会那么短和琐碎,但如果可能的话,某种伪代码将非常受欢迎


谢谢

线程/线程池之间的通信应通过线程安全队列进行

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

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

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

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

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

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

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

可以找到线程安全队列的示例

尽管有点复杂,但您可以看到一个应用服务器的实现,它可以处理您正在谈论的内容,尽管它可能会对您正在尝试的内容造成过度的杀伤力。源代码有很好的文档记录,因此您应该能够遵循它并了解它在做什么


我的示例对asio使用boost(请参阅同一系统中的),但对处理程序不使用boost io_服务

在我看来,最简单的方法是将每次拉动都放在一个单独的
io\u服务上。要进行通信,
post
函数在这些
io\u服务之间进行通信(请注意,您不知道哪个线程将处理您的post)。感谢您的及时回复,非常抱歉。我有个问题。从您的示例中,您有三个池(网络、进程、数据库)。如果只有两个池,网络池将通过某种线程安全的消息队列直接与数据库池对话,使用与您描述的相同的机制,那么它是否也可以工作?再次感谢。