boost::threadpool::pool vs.boost::thread_group

Posted

技术标签:

【中文标题】boost::threadpool::pool vs.boost::thread_group【英文标题】: 【发布时间】:2013-05-16 15:36:12 【问题描述】:

我试图了解不同的用例。以及2个线程使用之间的区别。 This 是我读过的很棒的教程,它解释了 boost::thread_group

这是我正在使用的代码:

boost::threadpool::pool s_ThreadPool(GetCoreCount());

CFilterTask task(pFilter,  // filter to run
    boost::bind(&CFilterManagerThread::OnCompleteTask, this, _1, _2) // OnComplete sync callback          // _1 will be filter name  // _2 will be error code
                );

// schedule the new task - runs on the threadpool
s_ThreadPool.schedule(task);

这是析构函数:

s_ThreadPool.wait(0);

你能解释一下吗?

【问题讨论】:

【参考方案1】:

boost::thread_group 是一个方便类,用于对线程集合执行线程管理操作。例如,thread_group 提供了一个方便的 join_all() 成员函数,而不是必须在每个线程上迭代 std::vector<boost::thread> 和调用 join()

对于boost::thread,不管它是否由boost::thread_group 管理,线程的生命周期通常取决于线程正在执行的工作。例如,如果创建一个线程来执行计算量很大的计算,那么一旦计算出结果,该线程就可以退出。如果工作是短暂的,那么创建和销毁线程的开销会影响性能。

另一方面,threadpool 是一种模式,其中多个线程服务于多个任务/工作。线程的生命周期与任务的生命周期没有直接关联。继续前面的示例,应用程序将安排计算量大的计算在线程池中运行。工作将在线程池中排队,并选择线程池的线程之一来执行工作。计算完成后,线程返回等待线程池安排更多工作。

如threadpool 示例所示,可以使用boost::thread_group 实现线程池以管理线程的生命周期,并使用boost::asio::io_service 实现任务/工作调度。

【讨论】:

很好解释的答案...给出了确切的想法

以上是关于boost::threadpool::pool vs.boost::thread_group的主要内容,如果未能解决你的问题,请参考以下文章

selenium chromedriver geckodriver iedriverserver下载

golang:%v,%+v,%#v的区别

v-show、v-if、v-bind

Vue.js常用指令汇总(v-if//v-show//v-else//v-for//v-bind//v-on等)

根据每个元素的i属性,由小到大排列如下数组ar=[{i:5,v:1},{i:5,v:4},{i:2,v:1},{i:1,v:3},{i:3,v:2},{i:6,v:1},{i:4,v:1}];

证明 U and V={0}时 dim(U+V)=dim(U)+dim(V)