这是一个初学者问题我想但是我找不到这个特定问题的答案:
我有一个大小为10的标准(c ++)向量v并且输入int。
让线程改变所有偶数位置是安全的(v.at(0)= x; v.at(2)= y;等等) 另一个线程同时改变奇数位置的所有值(v.at(1)= a; v.at(3)= b;等等)?
所以,在这两个线程的生命周期内,没有改变大小,没有push_back()等。
如果它不安全,使用数组会更好吗?
感谢您的帮助。
答案 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
大小在这些操作期间不会改变),因此您不需要任何其他同步第一个地方,除非你操纵多个线程中的任何元素(这不是你的情况)。