【发布时间】:2013-11-13 23:23:21
【问题描述】:
这可能是一个非常简单的问题,但由于我从未使用过线程,因此我认为最好是问而不是试图完全自己找到最佳解决方案。
我有一个巨大的 for 循环,它运行了数十亿次。在每次on循环运行时,程序根据当前的index,计算出一个数字形式的最终结果。我只对存储前result(或前x 个结果)及其相应索引感兴趣。
我的问题很简单,在线程中运行这个循环的正确方法是什么,以便它使用所有可用的 CPU/内核。
int topResultIndex;
double topResult = 0;
for (i=1; i < 1000000000; ++i) {
double result = // some complicated calculation based on the current index
if (result > topResult) {
topResult = result;
topResultIndex = i;
}
}
每个索引的计算完全独立,不共享资源。 topResultIndex 和 topResult 显然会被每个线程访问。
* 更新:Giulio 和 rolfl 的解决方案都很好,也非常相似。只能接受其中一个作为我的答案。
【问题讨论】:
-
每个索引的计算是独立的还是要共享资源进行计算?
-
每个索引的计算完全独立
-
如果循环受 CPU 限制,多线程将提高其速度(通过阿姆达尔定律给出的系数)。如果瓶颈是内存,它就行不通(因为多线程不会使 RAM 运行得更快)
-
好吧,当我在双核 CPU 上运行循环时,我看到 CPU 使用率正好上升到 50%,所以我可以假设 CPU 确实是瓶颈。 Ofc,只有在线程中实际运行后才能确定。
标签: java multithreading loops multiprocessing threadpool