2011-06-23 211 views
12

这是一个初学者问题,我猜但我找不到这个问题的答案:是< vector >线程安全在不同地点读/写?

我有一个标准的(c + +)向量v大小为10,类型为int。

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

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

如果它不安全,使用数组是否会成为更好的方法?

感谢您的帮助。

回答

10

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

在实践中,你应该能够用它获得了......直到有一天,有人(可能是你),使该计划的一个角落,所有的地狱破散小的变化。在任何非平凡的计划中做这件事我都不会感到舒服。

+1

+1试图避免不眠之夜这个应用程序交付后,更糟的是,增强/维持:( –

+0

谢谢您的回答,我看到你的意思... 虽然: 你会如何接近?问题的想法是变量的相当大的网格划分成部分共享的计算时间对整个电网的锁定/矢量会慢下来的东西相当多的 –

+2

@Benthebear:也许从对面...产生部分网格,独立处理每个部分而不锁定,并最终合并结果。可以这样做吗? – Jon

4

您描述的场景将是踏面安全的 - 您可以有效地操作固定尺寸阵列的各个元素(因为vector尺寸在这些操作过程中不会改变),所以除非您首先不需要任何额外的同步你操纵多个线程中的任何元素(这不是你的情况)。

7

从MSDN:Thread Safety in the Standard C++ Library

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

  • 从一个线程的时候,其他线程上没有作家。
  • 从许多线程一次没有其他线程上的作家。

对于写入同一个对象,该对象是线程安全的从一个线程写入时对其他线程

对于读取同一类的不同对象没有读者,对象是线程安全的阅读:

  • 从一次一个线程。
  • 从一个线程一次没有其他线程上的作家。
  • 来自多个主题。
  • 从许多线程一次没有其他线程上的作家。

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

  • 从一个线程时在其他线程没有读者。
  • 来自多个主题。

所以从以上,Theorotically,NO,它不会是线程安全的

4

理论上:没有。

实际上:是(根据多么所有知名补充交易实现)

5

它是依赖于机器。如果你有一个vector<char>处理器可能无法在单独的单词加载v [I]和v [I + 1]。您可能有缓存一致性问题。

编译器和处理器可能重新排序的指令,这可以打破即使上面不适用你的程序。 This is why C++0x has a memory model.

相关问题