接上一篇STL容器删除操做继续,STL使用起来方便,还有自动内存管理,再结合合适的泛型算法大大提升了咱们编程的效率,因而咱们“肆无忌惮”的使用在本身的程序中。可是只要你有“肆无忌惮”的态度,你终归是要走上弯路的,好比其线程安全问题。先从《Effective STL》进行搬运。git
线程安全的状况github
多个读取者是安全的。多线程可能同时读取一个容器的内容,这将正确地执行。固然,在读取时不能 有任何写入者操做这个容器。算法
对不一样容器的多个写入者是安全的。多线程能够同时写不一样的容器。编程
线程不安全的状况安全
在对同一个容器进行多线程的读写、写操做时。多线程
在每次调用容器的成员函数期间都要锁定该容器。ide
在每一个容器返回的迭代器(例如经过调用begin或end)的生存期以内都要锁定该容器。函数
在每一个在容器上调用的算法执行期间锁定该容器。线程
看到风险了吧?在工程中多线程操做STL的场景应该仍是比较常见的,一个典型的例子就是用其来作生产者——消费者模型的队列或者其余共享队列,这样为了应对线程安全问题咱们必须本身对容器操做进行封装。这是我本身实现的的封装类threadSafe_container.h,另外书中给咱们介绍了一种更通用的封装方法,你们能够本身去参考实现code
template<typename Container> // 获取和释放容器的互斥量 class Lock { // 的类的模板核心; public: // 忽略了不少细节 Lock(const Containers container) : c(container) { getMutexFor(c); // 在构造函数获取互斥量 } ~Lock() { releaseMutexFor(c); // 在析构函数里释放它 } private: const Container& c; };