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

Ben*_*ear 12 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;等等)同时?

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

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

谢谢你的帮助.

Jon*_*Jon 11

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

在实践中,你应该能够侥幸逃脱......直到有人(可能是你)在程序的一个角落做出一点改变并且所有地狱都破裂的那一天.在任何非平凡的计划中,我都不会感到很自在.

  • @Benthebear:也许来自对面......生成部分网格,独立处理每个部分而不锁定,最后合并结果.这可行吗? (2认同)
  • @Benthebear:一个数组会使实际的"它会起作用"的判决在学术上也是如此; 如果失去方便不会伤害你,那就继续吧.但就其本身而言,它无法解决"未来可能破裂"的问题.您可能需要考虑将数组的块作为特制迭代器传递; 这样,数组分区对您的工作人员来说是不透明的(没有发生事故的可能),并且您只会将所有这些责任压缩到一段代码中(其中创建了所有迭代器).应该是相当维护友好. (2认同)

Alo*_*ave 7

来自MSDN:标准C++库中的线程安全

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

  • 从一个线程一次没有其他线程上的编写器.
  • 从其他线程上没有编写器的许多线程.

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

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

  • 从一个线程一次.
  • 从一个线程一次没有其他线程上的编写器.
  • 一次从许多线程.
  • 从其他线程上没有编写器的许多线程.

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

  • 从一个线程,当没有其他线程的读者.
  • 来自许多线程.

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


Mih*_*yan 5

理论上:没有.

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


spr*_*aff 5

它取决于机器.如果你有一个vector<char>处理器可能无法用单独的单词加载v [i]和v [i + 1].您可能有缓存一致性问题.

编译器和处理器都可能重新排序指令,即使上述内容不适用,也可能会破坏程序.这就是C++ 0x具有内存模型的原因.