0

boost::threadis not-a-thread, anew threadftor传递给它的被调用时创建,线程在ftor返回时退出。

我们使用线程池来最小化线程创建和销毁的成本。但是当提供的ftor返回时,线程池中的每个线程也会被销毁。

那么构建线程池的基本概念是什么?是否有任何永久线程可以将ftors分配给该线程?

4

2 回答 2

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);

在上面的“代码”中,现在有四个线程,最初都在等待将某些东西放入“队列”中。当队列中有东西时,它会提取它,并将其作为函数调用。

这可能是实现线程池的最简单方法。

于 2012-07-27T07:24:53.687 回答
1

除了@Joachim 发布的内容:

对这样一个系统(也是我经常使用的一种)进行流控制的一种方法是使用任务的“池队列”(阻塞生产者-消费者队列),在启动时创建并填充固定数量的任务对象. 任何想要发出任务的线程都必须首先从池中获取一个,并且在完成处理后将任务返回到池中。这限制了系统中的任务数量,如果池为空,请求线程只需要等待,阻塞在空池上,直到一些“使用过的”任务返回。

这很好用,提供流量控制,防止内存失控并消除持续的任务创建/销毁。在计时器上定期显示/写入池队列深度也很容易,因此您可以看到您的应用程序有多“忙”(并检测任何泄漏:)。

编辑:此外,它消除了系统中任何有界队列的需要。无界队列更简单,并且往往需要更少的系统调用。

于 2012-07-27T10:26:18.073 回答