并行汇总数组

时间:2016-09-15 20:35:25

标签: c++ multithreading concurrency mutex

我有以下算法来总结数组的元素:

// global
index = 0
array = [...]
total_sum = 0 // this is what we're interested in

// per thread
thread_sum = 0
mutex.lock()
while (index < array.size) {
  mutex.unlock()

  thread_sum += array[index]

  mutex.lock()
  index++
}
total_sum += thread_sum
mutex.unlock()

每个线程运行相同的代码,并在完成后立即与主线程连接。问题是有时多个线程添加相同的数字。这是怎么发生的?

原始代码是用C ++编写的,使用的是std :: vector / thread / mutex / ref。

1 个答案:

答案 0 :(得分:0)

在释放锁之前递增index,否则多个线程可能会看到相同的值:

// per thread
thread_sum = 0
mutex.lock()
while (index < array.size) {
  i = index++
  mutex.unlock()

  thread_sum += array[i]

  mutex.lock()
}
total_sum += thread_sum
mutex.unlock()

然后,如果使用atomic integers,则可以更有效地以原子方式更改整数的值。

最后考虑在单个工作负载很小或非常可预测的情况下进行批处理,以减少同步的开销。