std:map和std:set的线程安全性

时间:2012-08-12 14:20:38

标签: c++ map set readwritelock

  

可能重复:
  Do I need to protect read access to an STL container in a multithreading environment?

如果某些线程正在读取:set或:map当另一个线程写入此set或map时,会发生什么?异常?

现在我使用读写锁,但我想删除锁,因为写操作不经常并且经常读取操作。

3 个答案:

答案 0 :(得分:4)

竞争条件将会发生:根据CPU对所做事情的排序,每次都会收到不同的结果。如果迭代器失效(例如删除一个线程中的项目而另一个线程有一个指向现在无效内存的迭代器)然后在另一个线程中使用,则会得到未定义的行为,因此要警惕死婴,粘土golems和haunts,以及更有可能的段错误,延迟段错误和运行时崩溃。

C ++ 11引入了mutex和其他线程设施:如果必须,保护您的读写操作。

答案 1 :(得分:0)

mutexs,锁具.... BRRR 尝试使用免费的锁容器。例如英特尔“线程构建块”又称TBB http://threadingbuildingblocks.org/files/documentation/a00130.html

答案 2 :(得分:0)

标准容器不是线程安全的,并且未指定它们具有Java意义上的“快速失败”迭代器。因此,对于不受保护的并发访问,至少有两件事可能出错:

  1. 容器上的数据竞争,这是未定义的行为
  2. 一个线程使迭代器无效,后来另一个线程使用等值迭代器。这也是未定义的行为,但它不一定是数据竞争,也是单线程程序中的错误。当它们在不同的线程中使用时,在同一个容器上丢失跟踪多个迭代器会更容易一些。
  3. 有人可能会说C ++的理念是“快速成功”,而且不要介意程序员失败时会发生什么;-)。因此,没有内置锁对许多用户来说是多余的。相反,这是你的问题 - 你宁愿不知道锁正在减慢这个程序,而不是不高兴他们正在减慢这个程序以及你用set编写过的所有其他程序,即使是集合不会同时访问。

      

    写作操作经常不经常和阅读操作。

    这正是读写器锁应该表现良好的情况。你可以改善你的情况的唯一方法是你可以将写操作从“不经常”减少到“从不”,这可能是你不能的。