C ++ 11中有没有并发容器?

特别是,我正在寻找一个阻塞队列。 C ++ 11中有这样的事情吗? 如果不是,我的其他select是什么? 我真的不想自己去了线程水平了。 太容易出错。

据微软Visual C ++团队的Diego Dagum介绍 :

一个反复出现的问题(很多,其中之一)是关于STL容器以及它们是否是线程安全的。

以Stephan的话来说,事实上他们并不是一个bug,而是一个特点:让每个STL容器的每个成员函数都获得一个内部锁,就会摧毁性能。 作为一个通用的,高度可重用的库,它实际上并不提供正确性:放置锁的正确级别取决于程序在做什么。 从这个意义上说,个人成员职能往往不是这样正确的水平。

并行模式库 (PPL)包含几个容器,它们提供对其元素的线程安全访问:

  • concurrent_vector类是一个序列容器类,允许随机访问任何元素。 它支持并发安全追加,元素访问,迭代器访问和迭代器遍历操作。
  • concurrent_queue类是一个序列容器类,允许对其元素的先进先出访问。 它支持一组有限的并发安全操作,比如push和try_pop等等。

这里有一些样品。

也有趣: http : //www.justsoftwaresolutions.co.uk/threading/implementing-a-thread-safe-queue-using-condition-variables.html 。

C ++ 11本身不提供并发容器。 但是,有库选项。 除了已经提到的PPL之外,别忘了英特尔TBB库。

它有一个并发queuehash_mapsetvector实现。 但它不仅是一个线程安全的容器库,它还提供了并行版本的标准algorithm(for-loop,reduce,sort …)。

英特尔TBB网站

我很惊讶,没有人提到moodycamel :: ConcurrentQueue 。 我们已经使用了相当长的一段时间,performance非常好。 具体是它的实现是无锁的,立即带来巨大的速度。 使用它的其他原因(从官方网站引用):

C ++没有那么多的完全无锁的队列。 Boost有一个,但是它仅限于带有普通赋值操作符和琐碎析构函数的对象。 英特尔的TBB队列不是无锁的,并且也需要简单的构造函数。 有许多学术论文用C ++实现无锁队列,但可用的源代码很难find,testing更是如此。

一些基准和比较可以在这里 , 这里和这里 。

容器的接口根本不是为了这个目的而devise的。 对于他们使用的接口,客户端可见的锁实际上是唯一可以实现这一点的方法,同时保证了正确性和可预测的行为。 这也是非常低效的,因为收购的数量将非常高(相对于良好的实施)。

解决scheme1

按价值传递(如适用)。

解决scheme2

创build一个简单的插入式实现的集合,您可以使用它来传递容器,同时持有一个范围locking(将其视为伪c ++):

 template <typename TCollection> class t_locked_collection { public: t_locked_collection(TCollection& inCollection, t_lock& lock) : collection(inCollection), d_lock(lock), d_nocopy() { } TCollection& collection; // your convenience stuff private: t_scope_lock d_lock; t_nocopy d_nocopy; }; 

那么调用者将该锁与该集合配对,然后在适当的情况下更新接口以使用(传递)容器types。 这只是一个穷人的class级延伸。

这个locking的容器是一个简单的例子,还有一些其他的变种。 这是我select的路线,因为它确实允许您使用适合您的程序的粒度级别,即使它不像locking方法那样透明(语法上)。 适应现有的程序也相对容易。 至less它以一种可预测的方式行事,与拥有内部锁的集合不同。

另一个变体是:

 template <typename TCollection> class t_lockable_collection { public: // ... private: TCollection d_collection; t_mutex d_mutex; }; // example: typedef t_lockable_collection<std::vector<int> > t_lockable_int_vector; 

…类似于t_locked_collection的types可以用来暴露底层的集合。 不要暗示这种做法是万无一失的,只是傻瓜抵抗。