2012-07-27 183 views
0

boost::thread不-一个线程,当ftor传递给它被调用,线程退出时ftor回报创建new thread如何使升压线程池::线程

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

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

+0

'ftor'?你的意思是functor?请在下次拼写出来。 – GManNickG 2012-07-27 05:51:17

+0

是functor ...... – 2012-07-27 06:01:10

+0

看看http://stackoverflow.com/questions/4084777/creating-a-thread-pool-using-boost – ForEveR 2012-07-27 06:06:12

回答

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

在“码”上现在有四个线程,最初都在等待着什么被放在一个“排队”。当队列中有东西时,它会提取它,并将其作为函数调用。

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

+0

实际上我只需要'threadpool.tryStart(f)'而不是'start'例如我不需要排队。因为队列可以无限长,因为我的存款利率远远高于执行率。另一方面,由于存款利率太高,它最终将作为投票工作。那么维护队列是否是正确的决定? (我在另一个线程中运行的'f'是一个Image比较器,我总是可以做一个代理回调,这个代理回调可以让我控制是否将相同的回调多次放入队列中,但仍然可以,没有一个队列是正确的决定?) – 2012-07-27 07:38:33

+0

+1我使用这样的显式线程池很多,用多种语言。它比现代语言中的某些“内置”线程池实现提供了更好的控制,其中一些似乎做出了关于何时添加额外线程的不适当决定。 – 2012-07-27 10:37:37

1

在addtion什么@Joachim发布:

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

这很好,控制,防止内存失控并消除创建/销毁的连续任务。在定时器上周期性地显示/写入池队列深度也很容易,所以你可以看到你的应用程序是如何“繁忙”的(并且检测到任何泄漏:)。

编辑:另外,它不需要系统中的任何有界队列。无界队列更简单,往往需要更少的系统调用。