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

Tar*_*rek 5 c++ stl thread-safety data-structures

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

Dav*_*nan 6

STL容器不是线程安全的.如果您愿意,您必须自己强加同步.

  • @Tarek即使容器本身是"线程安全的",它也不会神奇地为您提供跨线程的同步.例如,即使内部"插入"不会导致跨线程损坏,如果另一个线程有一个打开的迭代器,它可能会变得无效而无法预测它.你需要实现自己的锁. (4认同)
  • @Tarek:你怎么能期望在没有锁的情况下在容器中实现同步?有无锁数据结构,但这些通常不常见,你必须找到一个这样的库,并使你的算法适应他们提供的. (2认同)
  • @Voo*value*语义的语言与*reference*语义的语言之间存在巨大差异,特别是除非所有包含的元素仅提供原子操作,否则无法提供无锁容器来保存它们,无论如何好的容器操作是,插入*值*语言意味着*复制*值,就像*读取*值一样,如果可以*删除*,则无法以*无锁*方式执行.这正是我提到你需要*适应算法*(程序)的原因. (2认同)

Han*_*ant 6

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

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

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


Max*_*ert 3

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

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