哪个STL容器具有线程安全的插入过程?

时间:2011-10-29 15:54:57

标签: c++ data-structures stl thread-safety

哪个STL容器有一个线程安全插入过程?我想要几个线程同时插入同一个容器中。欢迎任何STL以外的实现(即Boost)!

6 个答案:

答案 0 :(得分:6)

  

我试图避免多线程中的关键区域,因为它会降低性能!

相反,提高性能。因为容器类可以执行的锁定类型只是非常细粒度的类型,必须为每个简单操作获取锁定。这太贵了。当您处理锁定时,您可以获得锁定并执行许多操作。这不会提高并发的几率,但会大大降低锁定开销。您可以选择对您的应用最有意义的策略,而不是强迫您。

除此之外,几乎不可能编写一个不容易出现死锁或非常昂贵的线程安全容器实现。迭代器就是问题所在。库编写器必须选择在迭代器的生命周期中锁定(冒着死锁)或者在另一个线程更改集合时需要更新所有实时迭代器(昂贵)。只有昂贵的选择是安全的。同样,你选择最有意义的策略,不会强迫你选择昂贵的选择。

答案 1 :(得分:5)

STL容器不是线程安全的。如果您愿意,您必须自己强制实施自己的同步。

答案 2 :(得分:3)

标准不要求任何STL容器是线程安全的。一个实现可能是线程安全的,虽然我不确定如何使用当前的API来实现它;并且更改API将使它们不再与标准兼容。

如果LGPL可以接受,Intel TBB有线程安全容器(这些容器在内部使用锁,这会影响它们的性能)。

答案 3 :(得分:2)

看看Boost.Lockfree(http://www.boost.org/doc/libs/1_53_0/doc/html/lockfree.html)。它提供了线程安全的实现:

boost::lockfree::queue
  a lock-free multi-produced/multi-consumer queue
boost::lockfree::stack
  a lock-free multi-produced/multi-consumer stack
boost::lockfree::spsc_queue
  a wait-free single-producer/single-consumer queue (commonly known as ringbuffer)

答案 4 :(得分:1)

容器遵循KISS原则(保持简单),因此没有同步功能。大多数情况下,这种假设的嵌入式同步是不够的,因为大多数时候访问某些其他对象必须与对容器的访问同步。将您的容器与一个锁组合,就是这样。

答案 5 :(得分:1)

既然你说过欢迎任何其他(非STL)实现,我建议英特尔的线程构建模块。它们具有线程安全的并发容器,具有非常好的性能特征。