STL 线程安全性

转载 2012年03月30日 14:58:29

http://blog.csdn.net/blade2001/article/details/1542392

STL 线程安全性

SGI STL [http://www.sgi.com/tech/stl/thread_safety.html]
The SGI implementation of STL is thread-safe only in the sense that simultaneous accesses to distinct containers are safe, and simultaneous read accesses to to shared containers are safe. If multiple threads access a single container, and at least one thread may potentially write, then the user is responsible for ensuring mutual exclusion between the threads during the container accesses.

http://www.csdn.net/Develop/read_article.asp?id=13936
摘录:
在所有的主流STL实现方案中,几乎所有的容器都是线程安全的:

1).一个线程读写一个实例时,另一个线程可以读写另一个实例。

2).多个线程可以在同时读同一个container。

3).多个线程读写同一个container时,你应该负责安排互斥性操作。



一个特例是std::string。在一些STL的实现厂商(包括MS VC6),使用的是带引用计数的string! 这就意味着可能有两个std::string的实例共享着同一块底层数据。这使得前面说的第一个规则被打破!



看一下这样的代码:

string s1= “abcd”;

string s2 = s1;



在引用计数的实现版本中,这几句话意味着:先分配一块内存给”abcd”,一个引用计数的数;s1和s2都将引用这块内存,引用计数将为2。引用计数的本意是在把strings传出functions时优化copy行为。

但是这种算法并不是线程安全的!

如果你将s2传给另一个线程,那么就很可能有两个线程企图修改这同一块内存!那将会有不可预料的行为发生。

理论上,你可以在两个线程之间增加线程同步,但是这个同步的代价将会大于你从引用计数中获得的好处!

这就是为什么主流的STL厂商不再使用引用计数的原因。比如,Dinkumware STL shipped with VC7。




Visual C++的STL并不是thread-safe,在它的allocator中,没有针对thread的同步问题做过任何特殊的设计,如果你用multi-thread操作同一个list container的话,最好自己完成同步方面问题;但如果你使用的是STLport提供的STL或者SGI STL的话,就应该是thread-safe,它的allocator做过一些特殊的设计

相关文章推荐

构造函数调用顺序

构造函数调用顺序: class B1 { public: B1(int i){cout

迷宫问题一 找到迷宫的一条路径(DFS+回溯)

问题描述: 一天,小明不小心进入了一个迷宫,现在请你帮助他判断能否出走出迷宫,如果可能,则输出YES. 如果不能走到出口,则输出NO. 每次走只能是上下左右4个方向. *表示可走 #表示障碍 ...

对STL容器线程安全性的期待现实一些

标准C++的世界是相当保守和陈旧的。在这个纯洁的世界,所有可执行文件都是静态链接的。不存在内存映射文件和共享内存。没有窗口系统,没有网络,没有数据库,没有其他进程。在这种情况下,当发现标准没有提到任何...

C++学习之STL线程安全性考虑

条款12:对STL容器线程安全性的期待现实一些  标准C++的世界是相当保守和陈旧的。在这个纯洁的世界,所有可执行文件都是静态链接的。不存在内存映射文件和共享内存。没有窗口系统,没有网络,没有数据库...

STL的线程安全性

Thread-safety for SGI STL SGI STL provides what we believe to be the most useful form of thread-saf...

线程安全性

  • 2012年07月23日 22:26
  • 2KB
  • 下载

深入研究Servlet线程安全性问题

  • 2013年12月24日 19:36
  • 52KB
  • 下载

Java集合(实现类线程安全性)

1、集合和Map     下图是Java集合的Collection集合体系的继承树:     下图是Java的Map体系的继承树:     对于Set、List、Qu...

java线程安全性总结

  • 2017年07月19日 16:16
  • 104KB
  • 下载

深入研究Servlet线程安全性问题

  • 2012年02月16日 13:10
  • 37KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:STL 线程安全性
举报原因:
原因补充:

(最多只允许输入30个字)