假设我有一个迭代次数超过 9000 次的 for 循环,我想用线程以某种方式改进它,比如说 10。
Function Something(){
for ( i = 0; i < 9000 ){
DoStuff();
}
}
用我的 10 个线程覆盖 9000 次迭代的最佳方法是什么?我目前正在使用 C++99 和 win32 pthreads,但我认为这是一个一般性问题。
提前致谢。
编辑:对于这个例子,假设 DoStuff() 处理繁重的处理,独立于其他迭代。此外,还有共享资源,但这些资源被互斥变量覆盖。
最佳答案
答案真的取决于 DoStuff()
实际做了什么。如果它是一些大 vector ,您要将其与另一个大(或小) vector 相乘,那么将它分成 10 个部分可能并不难。这适用于任何 CPU 密集型工作,其中每个计算都独立于其他计算。计算所有元素的总和也可以,但是你必须对一个部分求和,然后存储结果,当所有线程完成时,对不同的部分求和。
还有一些计算对于并行化是完全没用的。使用 F(n) = F(n-1) + F(n-2) 方法计算斐波那契数在线程中根本不起作用,因为在计算当前步骤之前需要上一步的结果步。
另一方面,如果 DoStuff
正在从单个文件中读取 1000 万条记录,那么拥有更多线程不太可能有任何帮助 - 因为顺序读取文件比分散读取快一点到处读取,磁盘比处理器慢得多,所以你不会得到任何东西。
关于c++ - 使用线程改进 For 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17049596/