是<矢量>线程安全在不同位置读/写?

时间:2011-06-23 13:52:04

标签: c++ multithreading vector thread-safety

这是一个初学者问题我想但是我找不到这个特定问题的答案:

我有一个大小为10的标准(c ++)向量v并且输入int。

让线程改变所有偶数位置是安全的(v.at(0)= x; v.at(2)= y;等等) 另一个线程同时改变奇数位置的所有值(v.at(1)= a; v.at(3)= b;等等)?

所以,在这两个线程的生命周期内,没有改变大小,没有push_back()等。

如果它不安全,使用数组会更好吗?

感谢您的帮助。

5 个答案:

答案 0 :(得分:11)

vector不提供任何线程安全保证,因此从技术上讲,答案是否定的。

在实践中,你应该能够侥幸逃脱...直到有人(可能是你)在程序的一个角落做出一点小改变并且一切都崩溃的那一天。在任何非平凡的计划中,我都不会这样做。

答案 1 :(得分:7)

来自MSDN: Thread Safety in the Standard C++ Library

对于对同一对象的读取,该对象对于读取是线程安全的:

  • 一次从一个线程开始,其他线程上没有编写器。
  • 在其他线程上没有编写器的情况下,从多个线程。

对于同一对象的写入,当其他线程上没有读者时,该对象是从一个线程写入的线程安全

对于同一类的不同对象的读取,该对象对于读取是线程安全的:

  • 一次从一个线程。
  • 一次从一个线程开始,其他线程上没有编写器。
  • 一次从多个线程。
  • 在其他线程上没有编写器的情况下,从多个线程。

对于同一类的不同对象的写入,该对象对于写入是线程安全的:

  • 从一个线程中没有其他线程的读者。
  • 来自很多线程。

所以从上面来看, 理论上,不,它不会是线程安全的

答案 2 :(得分:5)

理论上:不。

实际上:是(根据所有众所周知的STL的实施方式)

答案 3 :(得分:5)

它取决于机器。如果您有vector<char>,则处理器可能无法以单独的字加载v [i]和v [i + 1]。您可能遇到缓存一致性问题。

编译器和处理器都可能重新排序指令,即使上述内容不适用,也可能会破坏程序。 This is why C++0x has a memory model.

答案 4 :(得分:4)

您描述的场景将是安全的 - 您可以有效地操纵固定大小数组的各个元素(因为vector大小在这些操作期间不会改变),因此您不需要任何其他同步第一个地方,除非你操纵多个线程中的任何元素(这不是你的情况)。