A-A*_*A-A 6 c++ performance multithreading threadpool
我目前用C++编写了一个有时使用超过300个线程的程序.在我的程序中,我有一个结构数组,数组的长度等于线程数.假设我有400个结构,因此有400个线程.
在for循环的单次迭代中,我将一个函数应用于400个结构中的每一个,并且该函数在一个线程中执行.因此,我有400个并发运行的线程.(我正在使用boost线程库).
我试图分析我的代码是什么样的(它不是实际的代码):
struct my_struct{
// Structure's members
};
std::vector<my_struct> my_vec;
void my_fun(my_struct* my_str){
// Operations on my_str
}
int main(){
std::vector<boost::thread> thr(400);
for (int k = 0; k < 300; k++){
for (int i = 0; i < 400; i++){
thr.at(i) = boost::thread(my_fun, &my_vec.at(i));
}
}
for (int m = 0; m < M; m++){
thr.at(m).join();
}
}
}
Run Code Online (Sandbox Code Playgroud)
我使用的函数是计算密集型的,从上面的代码中,我使用400个线程进行计算,这样做了300次.有没有更有效的方法来执行此任务?我不确定一次有多少活动线程可能会影响性能.我听说过线程池库,但我不确定它是否会给我带来任何好处.任何帮助表示赞赏.
非常感谢你.
Ken*_*kot 16
除非您的目标计算机中有400多个处理器核心,否则产生400个CPU绑定线程绝对没有任何好处.
如果不知道您正在执行什么类型的计算以及何种数据,就不可能确切地告诉您如何更好地分配工作量.
在黑暗中拍摄,从你发布的内容来看,第一次尝试是使用N
线程(见下文),并在它们之间划分400个对象,以便每个线程负责处理大约400/N
对象.每个线程可以循环300次,并且在每次迭代时它可以处理每个分配的对象.
N
是一个任意数字; 事实上,我建议尝试不同的值并比较性能结果.但是,除非您的线程执行I/O或其他浪费时间阻塞非计算操作的操作,N
否则不应超过计算机中处理器核心的数量(尝试并快速观察性能下降).
编辑:根据正在进行的讨论,建议使用对象的队列,每个N
线程都可以从中弹出,因为它们已准备好进行更多工作.队列当然需要是线程安全的.为获得最佳性能,应实现无锁队列.有一个很好的文件在这里.您应该通过一次完全填充队列来简化实现,因此只需要线程安全读取.