1

Now I have a solver in that I need to keep a set of self-defined data type objects in a concurrent_vector or queue. It has to be concurrent because the objects come from different threads.With this concurrent container, I hope to sort these objects, eliminate duplicates and send them back when other threads need them.

However, I know TBB offers concurrent_vector and concurrent_queue which can be read and written concurrently from different threads. But how to sort the objects inside a container? Does everyone know how to do that? Thanks.

4

3 回答 3

3

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

TBB 并发容器是否使用操作系统同步对象?

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

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

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

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

于 2011-10-04T23:45:15.957 回答
1

concurrent_vector 与 std::sort 一起使用,并且 tbb 和 ppl (在示例包中)都提供了可以与之一起使用的并行排序。std::unique 的并行版本对于消除欺骗会更加有用,但您必须自己构建。

于 2011-10-14T22:33:19.693 回答
1

我猜生产者线程应该与消费者线程同时运行。因此,如果不需要对元素进行排序并使其唯一,一个简单的 concurrent_queue 就足够了。

如果您只需要使它们独一无二,则可以使用 a tbb::concurrent_hash_map

但是,如果您真的想对元素进行排序,则需要类似 concurrent_set (有序)的东西,它相当复杂并且在 tbb 中不存在。所以如果你真的需要对这些元素进行排序,我建议使用一个简单的锁,它必须用于将元素放入容器(例如 std::set)并从中检索它们。

于 2010-12-08T16:25:31.650 回答