如何使用boost :: thread创建一个threadpool

时间:2012-07-27 05:29:09

标签: c++ multithreading boost boost-thread

boost::thread not-a-thread ,调用传递给它的new thread时创建ftorftor时线程退出}返回。

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

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

2 个答案:

答案 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发布的内容之外:

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

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

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