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