多线程安全插入向量的最快方法是什么?

时间:2016-09-25 22:07:41

标签: c++ multithreading vector openmp mutex

我有一个程序,其中多个线程共享相同的数据结构,基本上是一个2D矢量数组,有时两个或多个线程可能必须插入相同的位置,即如果不采取预防措施可能导致崩溃的矢量。为此问题实施安全解决方案的最快和最有效的方法是什么?由于这个问题不经常发生(没有高争用)我有一个互斥的二维数组,其中每个互斥锁映射到一个向量,然后每个线程锁定然后在更新相应的向量完成后解锁互斥锁。如果这是一个很好的解决方案,我想知道是否有比使用互斥锁更快的东西。

注意,我使用OpenMP进行多线程处理。

1 个答案:

答案 0 :(得分:1)

解决方案很大程度上取决于问题的原因。例如:

  • 如果矢量大小可能超过其容量(即需要重新分配)。
  • 是否仅读取矢量,插入元素或插入和移除元素。

在第一种情况下,除了使用锁之外没有任何其他可能性,因为您总是需要检查是否正在重新分配向量,并在必要时等待重新分配完成。

另一方面,如果您完全确定向量仅由单个线程初始化一次(这不是您的情况),可能您不需要任何同步机制来执行向量元素的访问(内部元素)虽然可能仍然需要访问同步。

如果仅从向量的后面插入和删除元素(队列样式),那么使用atomic compare and swap就足够了(原子地增加向量的大小,并插入位置size-1当交换成功时。

如果可以在矢量的任何位置移除元素,则可能需要移动其内容以移除空洞。这种情况类似于重新分配。您可以使用自定义堆来管理向量中的空位置,但这会增加复杂性。

在一天结束时,您可能需要开发自己的并行数据结构或依赖库,例如TBBBoost