并行写入数组

nik*_*ack 5 c++ multithreading c++11

我有大量的数据需要从不同的线程中读取/写入随机位置.有一个mutex显然会杀死性能.我的想法是让mutexes每个人都负责阵列中的特定范围.这样在写之前我可以mutex根据我要编写的数组中的索引来锁定正确的.理论上它可以减少种族.但我想知道 - 也许有更好的方法?

Ami*_*ory 4

这听起来是一个合理的方法。

不过,有很多事情需要考虑:

  1. 您声明您的想法是拥有“许多互斥体,每个互斥体负责数组中的特定范围”。您可能应该考虑访问模式来决定如何将条目分配给互斥体。如果线程倾向于处理附近的条目,您可能会考虑使用不同的方案将条目分配给互斥体,例如,条目索引以互斥体的数量为模。

  2. 根据经验,请注意互斥体的数量应由线程的数量决定,而不是范围的大小。我在这个问题中写了更多关于这个问题的内容(这是在撰写本文时已接受的答案)。

  3. 同样,根据使用模式,您应该考虑使用读/写锁来避免同一条目上的多个读取器进行不必要的序列化。YMMV。