我只是在4核机器上运行一些多线程代码,希望它比单核机器更快.这是一个想法:我有一个固定数量的线程(在我的情况下,每个核心一个线程).每个线程都执行以下形式的Runnable:
private static int[] data; // data shared across all threads
public void run() {
int i = 0;
while (i++ < 5000) {
// do some work
for (int j = 0; j < 10000 / numberOfThreads) {
// each thread performs calculations and reads from and
// writes to a different part of the data array
}
// wait for the other threads
barrier.await();
}
}
在四核计算机上,此代码使用4个线程比使用1个线程执行更差.即使有CyclicBarrier的开销,我也会认为代码的执行速度至少要快2倍.为什么它运行得慢?
编辑:这是我尝试过的忙等待实现.不幸的是,它使程序在更多核心上运行得更慢(也在另一个问题here中讨论):
public void run() {
// do work
synchronized (this) {
if (atomicInt.decrementAndGet() == 0) {
atomicInt.set(numberOfOperations);
for (int i = 0; i < threads.length; i++)
threads[i].interrupt();
}
}
while (!Thread.interrupted()) {}
}