美文网首页
Effective STL 第12条

Effective STL 第12条

作者: 懒生活 | 来源:发表于2022-09-10 22:55 被阅读0次

容器的线程安全性

不能对容器的线程安全性抱太大的期望

对于stl容器,大部分容器只能保证
1)支持多线程同时读
2)支持多线程对不同的容器同时进行写
容器读写的线程安全性要靠用户自己保证.

  vector<int> v;
  vector<int>::iterator first5(find(v.begin(), v.end(),5));
  if(first5!=v.end())
    *first5 = 12;

对于上面这段代码,如果在找到并构建first5之后,如果有其它的线程对v进行了操作,如删除中间某个元素,直接会导致这个迭代器失效.此时线程的安全性就出现问题了.
为了保证线程安全,上面的代码要做如下的互斥

#include <mutex>
vector<int> v{ 1,3,4,5,56 };
std::mutex mutexForV;
int main()
{
    mutexForV.lock();
    vector<int>::iterator first5(std::find(v.begin(), v.end(), 5));
    if(first5!=v.end())
        *first5 = 15;
    mutexForV.unlock();
}

更好的手动互斥手段

上面的互斥手段依赖于lock和unlock, 如果在lock之后,发生异常, 那么永远不会执行unlock. 这可能会导致死锁. 使用lock_gard优化上面的代码. 因为c++保证,在发生异常的时候,创建的局部变量都会被析构.这样mutexForV_gard不管什么时候发生异常,离开作用域后肯定会被析构掉,析构的时候,可能会释放锁. 不光是保证了异常安全,而且也避免了编码时忘记unlock的风险.

vector<int> v{ 1,3,4,5,56 };
std::mutex mutexForV;
int main()
{
    std::lock_guard<std::mutex> mutexForV_gard(mutexForV);
    vector<int>::iterator first5(std::find(v.begin(), v.end(), 5));
    if(first5!=v.end())
        *first5 = 15;
}

相关文章

  • EFFECTIVE+STL中文版:50条有效使用STL的经验

    《Effective STL中文版:50条有效使用STL的经验》是EffectiveC++的第3卷,被评为“值得所...

  • 常用的 STL 查找算法

    常用的 STL 查找算法 《effective STL》中有句忠告,尽量用算法替代手写循环;查找少不了循环遍历,在...

  • Effective STL 第7条

    容器中的对象如果是指针,指针指向的资源,容器没有办法自动释放. 问题引出 容器在自己析构的时候,会把包含的对象逐个...

  • Effective STL 第28条

    正确使用reverse_iterator对于任何一个容器, 使用iterator, 你只可能正向正序访问容器内部的...

  • Effective STL 第22条

    主要不要修改set mutipleSet的key

  • Effective STL 第30条

    如果是区间操作,注意确保容器具有足够的区间 这个很矛盾, 我们害怕使用数组,就是因为数组有可能越界.为了不去考虑数...

  • Effective STL 第31条

    准确的选择排序算法 如果要对一个数列进行完全的排序,那么用sort是个不错的选择.但是如果只是部分排序, 要考虑更...

  • Effective STL 第34条

    为什么有些算法需要排序的区间 binary_search算法是二分查找, 这种查找需要查找空间的序列是有序的. 为...

  • Effective STL 第19条

    理解相等于等价相等的基础是 == , 如果x==y成立,就说明x和y的值相等对于有顺序关系的容器, 为了顺序的存在...

  • Effective STL 第25条

    散列表: 用key可以作为索引快速找到对应的value. 且这些对象在容器里面不排序. 散列表和标准关联容器set...

网友评论

      本文标题:Effective STL 第12条

      本文链接:https://www.haomeiwen.com/subject/zmnznrtx.html