我可能没有正确测量这个,但我有一些我正在玩的简单代码。我不认为它是一个线程池,因为如果我使工作单元非常大,那么 cpu 会达到 190-199%(我有双核),但如果我降低工作单元,但这些单元比我的 cpu 多得多以 140-160% 的速度运行程序。
我认为正在发生的是线程没有被池化,而是在需要时被销毁/创建,当工作负载较小时,这会使程序变慢。我tbb::task_scheduler_init
用来控制线程的数量,但我不知道如何告诉 tbb 让线程保持活动状态。
这里有一些代码来说明这个问题:
#include <iostream>
#include <list>
#include <tbb/task.h>
#include <tbb/task_group.h>
//#include <stdlib.h>
#include "tbb/task_scheduler_init.h"
#include <boost/thread.hpp>
using namespace tbb;
long fib(long a)
{
if (a < 2) return 1;
return fib(a - 1) + fib(a - 2);
}
class PrintTask
{
public:
void operator()()
{
//std::cout << "hi world!: " << boost::this_thread::get_id() << std::endl;
fib(10);
}
};
int main()
{
tbb::task_scheduler_init init(4); //creates 4 threads
task_group group;
for (int i = 0; i < 2000000; ++i)
{
group.run(PrintTask());
//std::cout << i << std::endl;
}
std::cout << "done" << std::endl;
group.wait();
return(0);
}
如果将 fib 更改为 40-45,每个线程的工作量会变大,因此会达到全速,但如果使用当前设置,那么工作量会非常小,但它会完成很多工作。
注意:我注意到可能相关的一件事是,在上述情况下,它完全使用了我的记忆(4 场免费)。经济放缓可能与此有关吗?另外为什么这个程序会占用所有内存?它将它存储在内存中是什么,如果我只是调用线程,是不是有一个队列告诉它运行多少次,或者它是否将整个线程保存在内存中运行?
我阅读了教程,但仍然对其行为感到困惑(尽管我确实得到了预期的结果)。