无锁容器如何响应并发分区和排序

How lockfree containers react to concurrent partitioning and sorting?

本文关键字:响应 并发 分区 排序 何响应      更新时间:2023-10-16

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

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

在对文档的肤浅检查中,TBB 有 concurrent_hash_map 和队列类,其相同。

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

concurrent_vector<T>是可动态增长的T数组

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

在清除数组之前,concurrent_vector从不移动元素,即使对于单线程代码,这也比 STL std::vector 更具优势

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

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

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