boost::thread
is not-a-thread, anew thread
在ftor
传递给它的被调用时创建,线程在ftor
返回时退出。
我们使用线程池来最小化线程创建和销毁的成本。但是当提供的ftor返回时,线程池中的每个线程也会被销毁。
那么构建线程池的基本概念是什么?是否有任何永久线程可以将ftors分配给该线程?
boost::thread
is not-a-thread, anew thread
在ftor
传递给它的被调用时创建,线程在ftor
返回时退出。
我们使用线程池来最小化线程创建和销毁的成本。但是当提供的ftor返回时,线程池中的每个线程也会被销毁。
那么构建线程池的基本概念是什么?是否有任何永久线程可以将ftors分配给该线程?
线程池只是一堆已经在运行的线程,它们都在运行相同的功能。这个函数基本上只是等待一个队列,当队列中有一个“函数”时,它会提取并执行它。
伪代码:
void thread_pool_function()
{
while (true)
{
wait_for_signal_that_queue_is_not_empty();
function_to_call = queue.remove_top();
unklock_queue_semaphore();
function_to_call();
}
}
create_thread(thread_pool_function);
create_thread(thread_pool_function);
create_thread(thread_pool_function);
create_thread(thread_pool_function);
在上面的“代码”中,现在有四个线程,最初都在等待将某些东西放入“队列”中。当队列中有东西时,它会提取它,并将其作为函数调用。
这可能是实现线程池的最简单方法。
除了@Joachim 发布的内容:
对这样一个系统(也是我经常使用的一种)进行流控制的一种方法是使用任务的“池队列”(阻塞生产者-消费者队列),在启动时创建并填充固定数量的任务对象. 任何想要发出任务的线程都必须首先从池中获取一个,并且在完成处理后将任务返回到池中。这限制了系统中的任务数量,如果池为空,请求线程只需要等待,阻塞在空池上,直到一些“使用过的”任务返回。
这很好用,提供流量控制,防止内存失控并消除持续的任务创建/销毁。在计时器上定期显示/写入池队列深度也很容易,因此您可以看到您的应用程序有多“忙”(并检测任何泄漏:)。
编辑:此外,它消除了系统中任何有界队列的需要。无界队列更简单,并且往往需要更少的系统调用。