C++ 11中是否有任何并发​​容器?

fre*_*low 53 c++ concurrency visual-studio-2010 blockingqueue c++11

特别是,我正在寻找一个阻塞队列.C++ 11中有这样的东西吗?如果没有,我的其他选择是什么?我真的不想再去自己的线程了.方式太容易出错.

Lio*_*gan 36

根据微软Visual C++团队的Diego Dagum的说法:

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

在这里采用斯蒂芬的话,现实是他们不是,不是作为一个错误而是作为一个特征:让每个STL容器的每个成员函数获得内部锁定都会消灭性能.作为通用的,高度可重用的库,它实际上也不会提供正确性:放置锁的正确级别取决于程序正在执行的操作.从这个意义上说,个别成员的职能往往不是那么正确.

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

  • concurrent_vector类是一个序列容器类,允许的任何元素的随机接入.它支持并发安全追加,元素访问,迭代器访问和迭代器遍历操作.
  • 所述concurrent_queue类是一个序列容器类,允许其元素先入先出的访问.它支持一组有限的并发安全操作,例如push和try_pop,仅举几例.

这里有一些样品.

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

  • 是的。但问题是——它只适用于 Windows =( (3认同)

小智 11

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

它有一个并发的queue,hash_map,setvector实施.但它不仅是一个线程安全的容器库,它还带有并行版本的标准算法(for-loop,reduce,sort,...).

英特尔TBB网站


Mil*_*kic 7

我很惊讶没人提到moodycamel :: ConcurrentQueue.我们已经使用它已经有一段时间了,它表现得非常好.具体而言,它的实现是无锁的,这会立即带来巨大的速度.使用它的其他原因(引自官方网站):

C++没有那么多完整的无锁队列.Boost有一个,但它仅限于具有普通赋值运算符和普通析构函数的对象.英特尔的TBB队列不是无锁的,也需要简单的构造函数.有许多学术论文在C++中实现无锁队列,但很难找到可用的源代码,测试更是如此.

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