在没有同步的情况下访问具有不同线程的不同子阵列是否安全?

时间:2012-02-22 23:33:24

标签: c++ arrays pthreads parallel-processing

如果我有10个线程,以及10个子阵列的数组,那么让每个线程在不同的子阵列上工作是否安全?即thread [0]对数组[0]进行填充,线程[1]向数组[1]进行填充等等。或者这样做不安全吗?如果它是一个向量或数组(或任何数据集),它会有所不同吗?

4 个答案:

答案 0 :(得分:3)

是的,你很安全。只要没有任何线程修改资源,其他线程就会在没有保护或同步的情况下进行访问,这是安全的。内存地址是否彼此非常接近并不重要;接近不起作用。重要的是是否共享,如果是,那么任何线程都会修改共享资源。

答案 1 :(得分:1)

是的,但请注意false sharing

答案 2 :(得分:1)

基本上是 - 它在阵列级别是安全的(但它也可能依赖 - 见下文)。但是,如果它是另一个结构,例如树或双向链表,那么如果您尝试修改结构,则可能会遇到问题,因为对一个元素的更改可能需要更改其他元素,这是不安全的。但只要你只是阅读数据,你应该没问题。一个可能的缺陷是如果数组包含引用或指针。在这种情况下,当您访问单独的数组条目时,可能会直接或间接引用内存中的相同区域。在这种情况下,您必须执行适当的同步。

所以简而言之:如果它是一个int数组或其他简单数据类型,那么你就完全安全了。如果它不是一个数组或者元素不是完全就地但包含指针或引用,那么你应该小心。

答案 3 :(得分:0)

如果你创建一个包含10个较小数组的“母数组”,并且每个线程只能访问其中一个数组,那么就不会发生任何不好的事情。这些数组元素的大小无关紧要。

如果您使用更复杂的结构而不是数组,如果读取不会改变任何内容,那么您也是安全的。但是,如果从结构中进行简单的读取可以修改它(例如某些内容被缓存,重新组织),那么让并行线程访问母结构可能会有问题。

除此之外 - 我没有看到任何可能导致麻烦的情况。