lockfree容器如何对并发分区和排序做出反应?

时间:2015-03-06 20:22:41

标签: c++ multithreading boost concurrency tbb

如何通过并发容器(例如在boosttbb实现中)对两个不同的线程同时执行分区和排序等两个标准算法进行处理?

1 个答案:

答案 0 :(得分:1)

Boost有无锁队列和堆栈。一个人不会对这些进行排序或分区。

在对文档进行表面检查时,TBB具有concurrent_hash_map和队列类,但同样如此。

只有来自TBB的concurrent_vector会提出这个问题。文档描述如下:

  

concurrent_vector<T>是一个可动态增长的T

数组

但是,只是存储(重新)分配是lockfree线程安全,而不是元素本身;

  

concurrent_vector永远不会移动元素,直到数组被清除,这可能比STL std :: vector更有优势,即使对于单线程代码也是如此

  

concurrent_vector上的操作对于增长而言是并发安全的,而不是用于清除或销毁向量。如果在concurrent_vector上有其他正在进行的操作,则不要调用方法clear()。

因此,如果您想对concurrent_vector进行排序,可能

  • 想要相互排除访问权限;如果延迟是至关重要的,你可以使用原子自旋锁而不是完全互斥的互斥锁,但无论如何你需要同步
  • 想要考虑复制到排序范围,保留源条目不变;这可以在没有进一步锁定的情况下完成(假设对向量元素的读操作是线程安全的),参见例如的 std::partial_sort_copy