我创建了一个使用管道模式进行处理的应用程序。 但是,我注意到当管道连续多次运行时,它往往变得越来越慢。
在管道阶段没有进行实际处理的情况也是如此 - 所以我很好奇我的管道实现是否有问题。
这是一个简单的测试程序,可以重现效果:
#include <iostream>
#include <boost/thread.hpp>
class Pipeline {
void processStage(int i) {
return;
}
public:
void run() {
boost::thread_group threads;
for (int i=0; i< 8; ++i) {
threads.add_thread(new boost::thread(&Pipeline::processStage, this, i));
}
threads.join_all();
}
};
int main() {
Pipeline pipeline;
int n=2000;
for (int i=0;i<n; ++i) {
pipeline.run();
if (((i+1)*100)/n > (i*100)/n)
std::cout << "\r" << ((i+1)*100)/n << " %";
}
}
在我的理解中,线程是在run()中创建的,在run()结束时它们被终止。因此,主程序中外循环开始时程序的状态应始终相同......
但我观察到的是处理此循环时增加的减速。
我知道在整个程序中保持管道线程活跃会更有效 - 但我需要知道我的管道实现是否存在问题。
谢谢! 顿
答案 0 :(得分:1)
我不知道run()减速的确切原因,但是当我使用代码obove并在main()循环结束时插入一点睡眠(500ms)然后运行缓慢()离开了。因此系统似乎需要一些“恢复时间”,直到它能够创建新线程。
答案 1 :(得分:0)
既然你做了新的boost :: thread()你试着清理它们吗?如果在Windows上运行,请参阅任务管理器,了解该进程打开的线程数,如果需要,请关闭线程句柄。我怀疑,系统创建的线程数量在不断增加..