可以说我有一个带有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万条记录,那么拥有更多线程几乎不可能完全有帮助-因为顺序读取文件比分散读取整个位置要快一点,因此磁盘比处理器慢得多,因此您将一无所获。

07-26 07:12
查看更多