现在我有一个求解器,我需要在concurrent_vector或queue中保留一组自定义的数据类型对象。它必须是并发的,因为对象来自不同的线程。对于这个并发容器,我希望对这些对象进行排序,消除重复,并在其他线程需要时将它们发回。
但是,我知道TBB提供的concurrent_vector和concurrent_queue可以从不同的线程同时读写。但是如何对容器内的对象进行排序? 大家都知道怎么做吗?谢谢。
答案 0 :(得分:3)
我认为你对TBB并发容器有一些误解。您可以参考TBB wiki
TBB并发容器是否使用OS同步对象?
在没有锁定的情况下访问和修改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)并从中检索它们。