- 多个线程可以同时读取一个容器中的内容,eg: find, begin, end 等.
- 多个线程对不同容器的同时写入合法。
- 但是,多个线程同时读写一个容器是很危险的。以map为例:
当你调用map的任何接口时,比如 end(), begin(), find()等时,可能会返回一个iterator,如果有别的线程正在修改这个map,你的iterator就变得无效了,再用这个iterator行为就可能出问题;或者在find()函数内部,会访问到map内部的红黑树的数据结构,而这个红黑树是有可能被别的线程调整的(比如别的线程往map中插入一个新的记录)。所以,是危险的。
通常情况下,我们采取以下方法,可以做到线程安全的容器(就是在有写操作的情况下仍能保证安全)。
- 每次调用容器的成员函数的期间需要锁定。
- 每个容器容器返回迭代器的生存期需要锁定。
- 每个容器在调用算法的执行期需要锁定。