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

Which STL container has a thread-safe insertion process?

本文关键字:安全 插入 过程 线程 STL 哪个      更新时间:2023-10-16

哪个STL容器有线程安全的插入过程?我想要几个线程同时插入在同一容器。除了STL之外的任何实现(例如Boost)都是受欢迎的!

STL容器不是线程安全的。如果你愿意的话,你必须自己使用你自己的同步。

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

相反,它提高的性能。因为容器类只能执行非常细粒度的锁定,必须为每个简单操作获取锁。这是昂贵的。当您注意到锁时,您可以获得锁并执行许多操作。这不会提高并发性的可能性,但会大大减少锁定开销。你可以选择对你的应用最有意义的策略,这不是强迫你的。

除此之外,几乎不可能编写一个线程安全的容器实现,既不容易死锁,也不太昂贵。迭代器就是问题所在。库编写者必须在迭代器的生命周期内使用锁(有死锁的风险)或在另一个线程更改集合时更新所有活动迭代器(代价高昂)之间做出选择。只有昂贵的选择才是安全的。再一次,你选择了最有意义的策略,昂贵的选择不会强加给你。

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

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

看看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)

容器遵循KISS原则(Keep It Simple),因此不具有同步特性。大多数时候,这种假设的嵌入式同步是不够的,因为大多数时候,对其他对象的访问必须与对容器的访问同步。

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