博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
STL 线程安全性
阅读量:2341 次
发布时间:2019-05-10

本文共 1213 字,大约阅读时间需要 4 分钟。

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.

 

  

  摘录:  
  在所有的主流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做过一些特殊的设计 

转载地址:http://sdzvb.baihongyu.com/

你可能感兴趣的文章
JAVA面试700问
查看>>
数据库DDL,DML,DCL,TCL
查看>>
各大数据库概述,比较
查看>>
子页面跳转
查看>>
常用算法总结
查看>>
数据库连接池
查看>>
JAVA Webservice
查看>>
Hibernate自动生成实体类
查看>>
Java Memcached
查看>>
JAVA WebSpider
查看>>
XML自动建表/存库
查看>>
Java实现Web服务器
查看>>
C# readonly与const的区别
查看>>
MFC 自定义消息的一般过程
查看>>
剖析Windows消息处理机制
查看>>
多线程入门教程(二)基本概念
查看>>
多线程入门教程(三)线程控制
查看>>
多线程入门教程(四)线程间通信
查看>>
多线程入门教程(五)MFC的多线程
查看>>
多线程入门教程(六)综合实例
查看>>