STL容器的线程安全?

接上一篇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;
};
相关文章
相关标签/搜索