哪个STL容器具有线程安全的插入过程
Which STL container has a thread-safe insertion process?
哪个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)实现都是受欢迎的,我建议使用英特尔的线程构建块。他们有线程安全的并发容器,具有非常好的性能特征。
- 从不同线程使用int64的不同字节安全吗
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 预处理器:插入结构名称中的前一个行号
- 虚拟决赛作为安全
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 在未初始化映射的情况下,将值插入到映射的映射中
- 如何在c++中只将键插入到bimap的一侧
- 如何将元素添加到数组的线程安全函数?
- 如何将结构插入到集合中并打印集合的成员
- C++json插入数组
- 如果迭代器没有因插入而无效,则使用std::find和C::insert()是线程安全的
- 假设 C++11 中已知子级布局,重新插入基类是否安全
- 插入没有空终止符空间的字符串是否安全?
- 在插入时同时迭代一个映射,这在什么方面是不安全的
- 这个无锁数据列表插入是安全的吗
- 在单个链表中擦除和插入线程安全吗
- 向量::插入的异常安全保证是什么?
- 哪个STL容器具有线程安全的插入过程