如何通过并发容器(例如,在boost或tbb实现中)同时处理两个标准算法(例如分区和排序),它们同时形成2个不同的线程?
最佳答案
Boost具有无锁队列和堆栈。一个人不对这些进行排序或划分。
在对文档进行表面检查时,TBB具有current_hash_map和队列类。
只有TBB的concurrent_vector
会提出这个问题。该文档描述如下:
concurrent_vector<T>
是T
的可动态增长的数组
但是,仅存储(重新)分配是无锁的线程安全,而不是元素本身。
parallel_vector在清除数组之前永远不会移动元素,即使对于单线程代码,这也比STL std :: vector更好。
和
就并发而言,对并发向量进行操作对于并发是安全的,而不是清除或销毁向量。如果并发向量上正在进行其他操作,则永远不要调用方法clear()。
因此,如果您要对current_vector进行排序,则可能
希望互相排斥访问;如果延迟至关重要,则可以使用原子自旋锁而不是成熟的互斥锁,但是无论如何都需要同步
希望考虑复制到排序范围,而源条目保持不变;这可以在不进一步锁定的情况下完成(假设对向量元素的读取操作是线程安全的),请参见例如std::partial_sort_copy