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做过一些特殊的设计

STL容器的线程安全性

《Effective C++》中关于这个问题的阐述   条款12:对STL容器线程安全性的期待现实一些 标准C++的世界是相当保守和陈旧的。在这个纯洁的世界,所有可执行文件都是静态链接的。不存在内存...
  • snowriver99
  • snowriver99
  • 2013年10月31日 13:44
  • 436

C++ 11 STL 线程库实现的线程同步与互斥

以前操作系统课程设计的时候,我们在Linux操作系统中用C语言和POSIX线程库编写过线程同步与互斥。 /* * thread_synchronization.c * * Co...
  • yjf_victor
  • yjf_victor
  • 2015年04月15日 22:12
  • 7130

STL的线程安全解决方案

由于STL不是线程安全的, 所以在每一次插入元素,删除元素,读取元素时,必须保证原子操作.   读取元素也许要原子? 嗯,是的. 因为你得到了一个迭代器后, 这个迭代器对应的容器可能被别的线程修...
  • XscKernel
  • XscKernel
  • 2016年08月02日 15:37
  • 1567

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

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

C++并发实战12:线程安全的queue

1 首先看下STL中的queue的接口: template > class queue { public: explicit queue(const Container&); e...
  • liuxuejiang158
  • liuxuejiang158
  • 2013年12月13日 15:16
  • 8551

stl string对象多线程使用

c程序所有对象类变量,包括string,stl所有对象,一般的结构体,一般的类等非bool i8 i16 i32 i64 int float double等基本类型的,如果要修改其,要注意给它加上写锁...
  • zhaoyongling
  • zhaoyongling
  • 2017年03月31日 15:47
  • 296

关于STL容器的线程安全特性

标准C++的世界是相当保守和精简的。在这个纯洁的世界,所有可执行文件都是静态链接的。不存在内存映射文件和共享内存。没有窗口系统,没有网络,没有数据库,没有进程。在这种情况下,当发现标准没有提到任何关于...
  • gaokewoo
  • gaokewoo
  • 2014年04月26日 21:51
  • 840

C++11多线程(十八):线程池

1.三方库及操作系统库实现线程池: 线程池的实现有很多,使用BOOST,WINDOWS,LINUX库,参考链接:http://www.cnblogs.com/lizhenghn/p/3740186.h...
  • ceasadan
  • ceasadan
  • 2016年01月07日 11:54
  • 570

单例中的线程不安全性

一、单例设计模式(懒汉式)中的线程不安全问题 看之前写过的一个单例public class SingleTest { /** * @param args */ p...
  • baidu_26439387
  • baidu_26439387
  • 2015年06月22日 15:39
  • 476

多线程提高系列(1)--线程的优势以及风险性

使用的线程的优势以及带来的风险性
  • L_kanglin
  • L_kanglin
  • 2017年04月12日 21:50
  • 291
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:STL 线程安全性
举报原因:
原因补充:

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