如何排序TBB concurrent_vector或concurrent_queue?

时间:2010-09-20 17:59:50

标签: sorting tbb concurrent-queue concurrent-vector

现在我有一个求解器,我需要在concurrent_vector或queue中保留一组自定义的数据类型对象。它必须是并发的,因为对象来自不同的线程。对于这个并发容器,我希望对这些对象进行排序,消除重复,并在其他线程需要时将它们发回。

但是,我知道TBB提供的concurrent_vector和concurrent_queue可以从不同的线程同时读写。但是如何对容器内的对象进行排序? 大家都知道怎么做吗?谢谢。

3 个答案:

答案 0 :(得分:3)

我认为你对TBB并发容器有一些误解。您可以参考TBB wiki

TBB并发容器是否使用OS同步对象?

  • 不,他们没有。 TBB并发容器利用TBB用户级同步原语和原子操作。

在没有锁定的情况下访问和修改tbb::concurrent_vector的元素是否可以线程安全?

  • 不,你必须明确使用锁。

因此,concurrent_vector不支持线程安全的多线程读写。 我希望这有帮助。

答案 1 :(得分:1)

concurrent_vector与std :: sort和tbb& ppl(in the sample pack)提供可与此一起使用的并行排序。 std :: unique的并行版本对于删除dupes更有用,但你必须自己构建。

答案 2 :(得分:0)

我猜生产者线程应该与消费者线程同时运行。 因此,如果元素不需要被排序并且变得唯一,那么简单的concurrent_queue就足够了。

如果您只需要将它们设为唯一,那么您可以使用tbb::concurrent_hash_map

但是,如果你真的想要对元素进行排序,你需要像a这样的东西 concurrent_set(ordered),它相当复杂,在tbb中不存在。 因此,如果你真的需要对这些元素进行排序,我建议使用一个简单的锁,它必须被要求将元素放入容器(例如std :: set)并从中检索它们。