可以说我有一个带有9000+次迭代的for循环,我想以某种方式用线程来改进它,比如说10。
Function Something(){
for ( i = 0; i < 9000 ){
DoStuff();
}
}
用我的10个线程覆盖9000次迭代的最佳方法是什么?我目前正在使用C++ 99和win32 pthread,但是我认为这是一个通用问题。
提前致谢。
编辑:对于此示例,可以说DoStuff()处理繁重的处理,独立于其他迭代。此外,存在共享资源,但是互斥变量覆盖了这些资源。
最佳答案
答案实际上取决于DoStuff()
实际执行的操作。如果要将某个较大的 vector 与另一个较大的(或较小的) vector 相乘,则将其切成10个部分可能并不那么困难。对于每个计算都独立于其他计算的CPU密集型工作而言,这可以正常工作。计算所有元素的总和也可以,但是您必须总结一个部分,然后存储结果,当所有线程完成时,总结不同的部分。
也有一些计算对于并行化是完全没有用的。使用F(n)= F(n-1)+ F(n-2)方法计算斐波那契数在线程中根本无法正常工作,因为在计算当前值之前,需要上一步的结果步。
另一方面,如果DoStuff
从单个文件中读取1000万条记录,那么拥有更多线程几乎不可能完全有帮助-因为顺序读取文件比分散读取整个位置要快一点,因此磁盘比处理器慢得多,因此您将一无所获。