我正在处理一个图,它可以按顺序工作,现在我想通过并发处理来提高其性能。
这就是我在做什么:
我在每次迭代中遍历图形中的所有边。
每次迭代都会生成一个输出数组,该输出数组将馈入下一个 迭代。
要同时处理图形,我将基于 关于线程数,我正在使用,并且在每次迭代后使用障碍对线程进行同步。
这是我的代码,为简洁起见,我省略了一些变量声明,方法等
class Worker implements Runnable {
ReentrantLock lock = new ReentrantLock();
void run() {
while (true) {
barrier.await();
lock.lock();
iterate(input_array, output_array);
lock.unlock();
barrier.await();
}
}
}
class ProcessGraph {
void iterate(input_array, output_array) {
for (int i = 0; i < num_of_edges; i++) {
int processed_number = process_edge(i);
output_array[destinations[i]] += processed_number;
}
}
}
声明数组保留顶点,并且小于num_of_edges
,因此在写入output_array时会有一些重叠。
我在每个线程的迭代方法周围放置了一个锁,以确保对output_array的写入是原子的。
问题 由于每次迭代都只是添加到先前的迭代中,因此即使它不是原子执行的,代码也总是会产生正确的答案。
我认为添加锁将确保output_array[destinations[i]] += processed_number;
被原子执行。
因此,如果两个线程试图同时写入output_array
,则一个线程将被迫等待。
我不认为这是因为当使用锁和不使用锁执行时,我的代码以相同的速度运行,并且我不知道如何检查代码是否以原子方式执行。