多线程安全地插入矢量的最快方式是什么?
我有一个程序,其中多个线程共享相同的数据结构,该数据结构基本上是一个2D矢量阵列,有时两个或更多线程可能不得不在相同位置插入,即如果没有采取预防措施可能导致崩溃的向量。 为此问题实施安全解决方案的最快和最有效的方式是什么? 由于这个问题不经常发生(没有很高的争用),我有一个二维数组互斥体,每个互斥体映射到一个向量,然后每个线程锁定,然后在更新相应向量完成后解锁互斥体。 如果这是一个很好的解决方案,我想知道是否有比使用互斥锁更快的东西。
请注意,我正在使用OpenMP进行多线程。
解决方案在很大程度上取决于问题的方式。 例如:
在第一种情况下,除了使用锁之外,您没有其他可能,因为您总是需要检查向量是否被重新分配,并在必要时等待重新分配完成。
另一方面,如果你完全确定vector只被一个线程初始化(这不是你的情况),可能你不需要任何同步机制来访问vector元素(内部元素访问同步可能仍然需要)。
如果只从元素背面插入元素(队列样式),然后使用原子比较和交换就足够了(原子地增加向量的大小,并在交换成功时插入到位置size-1
。
如果元素可能在矢量的任何点被移除,则其内容可能需要移动以移除空洞。 这种情况类似于重新分配。 您可以使用自定义堆来管理向量中的空位置,但这会增加复杂性。
在一天结束时,您可能需要开发自己的并行数据结构或依赖库(如TBB或Boost)。
链接地址: http://www.djcxy.com/p/51223.html上一篇: What is the fastest way for multiple threads to insert into a vector safely?