转载http://blog.csdn.net/zdl1016/article/details/5941330

STL的线程安全. 说一些关于stl容器的线程安全相关的话题。

一般说来,stl对于多线程的支持仅限于下列两点:(貌似Effective STL中有描述)

1.多个读取者是安全的。即多个线程可以同时读取一个容器中的内容。 即此时多个线程调用 容器的不涉及到写的接口都可以 eg find, begin, end 等.

2.对不同容器的多个写入者是安全的。即多个线程对不同容器的同时写入合法。 但是对于同一容器当有线程写,有线程读时,如何保证正确? 需要程序员自己来控制,比如:线程A读容器某一项时,线程B正在移除该项。这会导致一下无法预知的错误。 通常的解决方式是用开销较小的临界区(CRITICAL_SECTION)来做同步。以下列方式同步基本上可以做到线程安全的容器(就是在有写操作的情况下仍能保证安全)。

  1.每次调用容器的成员函数的期间需要锁定。

  2.每个容器容器返回迭代器的生存期需要锁定。

  3.每个容器在调用算法的执行期需要锁定。

  和小罗的关于task_server的多线程安全的交流: 是这样的, 当你调用map的任何接口时, 比如 end(), begin(), find()等时, 可能会返回一个iterator, 如果有别的线程正在修改这个map, 你的iterator就变得无效了, 再用这个iterator行为就可能出问题. 或者在find()函数内部, 会访问到map内部的红黑树的数据结构, 而这个红黑树是有可能被别的线程调整的(比如别的现在往map中插入一个不存在的记录). 所以, 是危险的.

  查了一下官方文档对线程安全的描述。其大意也是,为了效率,没有给所有操作加锁。不同线程同时读同一容器对象没关系,不同线程同时写不同的容器对象没关系。但不能同时又读又写同一容器对象的。因此,多线程要同时读写时,还是要自己加锁。

STL容器是否是线程安全的相关推荐

  1. c++ hashset的用法_c++ stl容器set成员函数介绍及set集合插入,遍历等用法举例

    c++ stl集合set介绍 c++ stl集合(Set)是一种包含已排序对象的关联容器.set/multiset会根据待定的排序准则,自动将元素排序.两者不同在于前者不允许元素重复,而后者允许. 1 ...

  2. 6.切勿对STL容器的线程安全性有不切实际的依赖

    STL自身对多线程的支持非常有限.对于STL,你能期望的是: 多个线程读是安全的. 多个线程对不同的容器做写入操作时安全的. 在需要修改STL容器或这调用STL算法时需要自己加锁. 为了实现异常安全, ...

  3. STL容器的线程安全

    STL容器是线程不安全的. 线程安全的情况 多个读取者是安全的.多线程可能同时读取一个容器的内容,这将正确地执行.当然,在读取时不能 有任何写入者操作这个容器. 对不同容器的多个写入者是安全的.多线程 ...

  4. C++ 笔记(19)— 标准模板库(STL容器、STL迭代器、STL算法、STL容器特点、STL字符串类)

    C++ 标准库可以分为两部分: 标准函数库: 这个库是由通用的.独立的.不属于任何类的函数组成的.函数库继承自 C 语言. 面向对象类库: 这个库是类及其相关函数的集合. C++ 标准库包含了所有的 ...

  5. C++拾趣——STL容器的插入、删除、遍历和查找操作性能对比(Windows VirtualStudio)——遍历和删除

    相关环境和说明在<C++拾趣--STL容器的插入.删除.遍历和查找操作性能对比(Windows VirtualStudio)--插入>已给出.本文将分析各个容器中遍历和查找的性能.(转载请 ...

  6. C++拾趣——STL容器的插入、删除、遍历和查找操作性能对比(Windows VirtualStudio)——删除

    相关环境和说明在<C++拾趣--STL容器的插入.删除.遍历和查找操作性能对比(Windows VirtualStudio)--插入>已给出.本文将分析从头部.中间和尾部对各个容器进行删除 ...

  7. C++拾趣——STL容器的插入、删除、遍历和查找操作性能对比(ubuntu g++)——遍历和查找

    相关环境和说明在<C++拾趣--STL容器的插入.删除.遍历和查找操作性能对比(ubuntu g++)--插入>已给出.本文将分析各个容器中遍历和查找的性能.(转载请指明出于breakso ...

  8. C++拾趣——STL容器的插入、删除、遍历和查找操作性能对比(ubuntu g++)——删除

    相关环境和说明在<C++拾趣--STL容器的插入.删除.遍历和查找操作性能对比(ubuntu g++)--插入>已给出.本文将分析从头部.中间和尾部对各个容器进行删除的性能.(转载请指明出 ...

  9. STL容器存储的内容动态分配情况下的内存管理

    主要分两种情况:存储的内容是指针:存储的内容是实际对象. 看以下两段代码, typedef pair<VirObjTYPE, std::list<CheckID>*> VirO ...

最新文章

  1. 解读2018年诺贝尔化学奖成果:用进化的力量解决化学问题
  2. 编写五子棋的完整python代码_python实现五子棋游戏(pygame版)
  3. java代码代替xml实现图片
  4. 跳转控制语句之break
  5. 常见的Content-Type类型
  6. oracle数据库中VARCHAR2(50 CHAR) 和VARCHAR2(50) 有啥区别?
  7. 如何发布GAE的应用(一)
  8. python键_Python键盘按键模拟
  9. spring 事物配置几种
  10. MarkDown2安装后不能预览的问题 awesomium_v1.6.6_sdk_win.exe下载
  11. 无纸化办公中如何保护数据安全
  12. 计算机中mac ip地址查询,如何通过mac地址查ip,详细教您Mac怎么查看ip地址
  13. AMH主机面板实现伪静态规则教程
  14. (信息学奥赛一本通 1299)糖果#线性动态规划#
  15. ubuntu16.04 basler相机 图像采集卡设置
  16. 关于macbook鼠标不流畅问题
  17. 跳转go.php,go.php · 莫轻舞/go.php 站内外链跳转源码 - Gitee.com
  18. 记录一次排查进程莫名其妙被杀死的排查过程
  19. tp6 项目的创建与多应用
  20. 特征融合 Pytorch concat串连两个预训练特征

热门文章

  1. lab2_selenium测试
  2. 请求一个action,将图片的二进制字节字符串在视图页面以图片形式输出
  3. java解析xml的三种方法
  4. 一:c#基本语法(2)(老田学习笔记)
  5. Oracle 统计信息(1)
  6. linux相等路径,关于linux:如何检查Bash中两条路径是否相等?
  7. python 根据判断产生新列_pandas DataFrame 根据多列的值做判断,生成新的列值实例...
  8. [Nova] Failed to get shared write lock Is another process using the image?
  9. NanoPi NEO Air使用二:固件烧录
  10. echo -n 和echo -e 参数意义