STL自身对多线程的支持非常有限。对于STL,你能期望的是:
- 多个线程读是安全的。
- 多个线程对不同的容器做写入操作时安全的。
在需要修改STL容器或这调用STL算法时需要自己加锁。
为了实现异常安全,最好不要手动加锁解锁,多使用RAII。
例如多使用std::lock_guard(),std::lock_guard是RAII模板类的简单实现,功能简单。
std::lock_guard 在构造函数中进行加锁,析构函数中进行解锁,即使遭遇异常,依旧可以保证锁被释放。
C++保证,如果有异常被抛出,局部对象会被析构。
为了缩小RAII类对象的作用域,可以通过使用“{ }”,使对象提前析构、释放锁、减小代码被锁区间。
std::vector<int> datas;
std::mutex oneMutex;
...
{
std::lock_guard(one);
... // 操作datas
}