C++ STL对不同的容器是否是线程安全的(使用STLport实现)?

Rav*_*avi 11 c++ stl thread-safety

我使用的是Android 2.2,它附带了一个STLport版本.出于某种原因,它被配置为非线程安全的.这是在配置头文件中使用#define _NOTHREADS完成的.

当我从不同的pthreads 构造和初始化不同的非共享容器(例如字符串)时,我得到了内存损坏.

使用_NOTHREADS,看起来在allocator.cpp中的STL中的某些低级代码不能正确锁定.这似乎类似于C不为malloc提供线程安全性.

有谁知道为什么在Android上默认使用_NOTHREADS构建STL?通过关闭它,我想知道是否可能有副作用.我能想到的一件事是性能略有下降,但鉴于我使用了大量的线程,我没有看到太多的选择.

Ken*_*oom 5

SGI STL

SGI STL是所有其他STL实现的祖母.

请参阅SGI STL文档.

STL的SGI实现仅在对不同容器的同时访问是安全的意义上是线程安全的,并且对共享容器的同时读取访问是安全的.如果多个线程访问单个容器,并且至少有一个线程可能写入,则用户负责确保在容器访问期间线程之间的互斥.

G ++

libstdc ++ docs

我们目前使用SGI STL定义的线程安全性.

STLPort的

STLPort文档

有关线程安全的详细文档,请参阅SGI站点.基本要点是:

  • 从单独的线程内同时读取同一容器是安全的;
  • 同时访问不同的容器(不在线程之间共享)是安全的;
  • 如果任何线程可以修改共享容器,则user必须为所有访问提供同步.