如何使用boost::thread创建线程池
how to make a threadpool with boost::thread
boost::thread
是非线程,当调用传递给它的ftor
时会创建new thread
,当ftor
返回时线程退出。
我们使用线程池来最大限度地减少线程创建和销毁成本。但是当提供的ftor返回时,线程池中的每个线程也会被破坏。
那么,构建线程池背后的基本概念是什么呢?有什么永久线程可以为该线程分配ftor吗?
线程池只是一堆已经在运行的线程,它们都在运行相同的函数。这个函数基本上只是在队列上等待,当队列中有"函数"时,它会提取并执行它
伪代码:
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发布的内容:
流控制这样一个系统的一种方法(也是我经常使用的一种)是使用任务的"池队列"(阻塞生产者-消费者队列),在启动时创建并填充固定数量的任务对象。任何想要发出任务的线程都必须首先从池中获取任务,并且任务在完成处理后返回到池中。这限制了系统中任务的数量,如果池清空,请求线程只需等待,在空池上被阻塞,直到一些"已用"的任务返回。
这可以很好地工作,提供流控制,防止内存失控,并消除持续的任务创建/销毁。在计时器上定期显示/写入池队列深度也很容易,这样你就可以看到你的应用程序有多"忙"(并检测任何泄漏:)。
编辑:此外,它还消除了系统中任何有界队列的需要。无边界队列更简单,并且往往需要更少的系统调用。
相关文章:
- 两个线程一个使用流 Api,另一个线程创建文件失败并出现错误ERROR_SHARING_VIOLATION
- C++ 线程创建/删除与线程停止/恢复
- Qt - 如何从线程创建 QFuture
- 我可以使用Qt线程ID为每个线程创建唯一的缓存吗?
- 零MQ 后台线程创建
- OpenMP 线程创建
- GLFW & ImGui:从 main 以外的线程创建 ImGui 控件
- 对象:无法为位于不同线程中的父线程创建子级
- C++ 11:线程创建给我一个"Attempt to use a deleted function"错误
- C 的周期性线程创建
- MPI - 当数组初始化值必须为常量时,如何为工作线程创建部分数组
- 当主GUI线程被阻塞时,如何从工作线程创建无模式对话框
- 多个线程创建5个线程来计算质数
- 为线程创建模板
- 线程创建,CRT和DLL是如何完成的?
- 同步线程创建和销毁(静态)对象
- 竞争条件:一个线程创建静态对象,另一个线程在初始化完成之前使用它.如何处理
- 从不同线程创建QMainWindow
- QFuture 无法为位于不同线程中的父线程创建子级
- ( QNativeSocketEngine)QObject:无法为位于不同线程中的父线程创建子级