【问题标题】:Is it safe to access different sub-arrays with different threads without syncing?在不同步的情况下访问具有不同线程的不同子阵列是否安全?
【发布时间】:2012-02-22 23:33:23
【问题描述】:

如果我有 10 个线程和一个由 10 个子数组组成的数组,让每个线程在不同的子数组上工作是否安全?即线程 [0] 对数组 [0] 进行处理,线程 [1] 对数组 [1] 进行处理,等等。或者这样做不安全吗?如果它是一个向量或数组(或任何相关的数据集),它会有所不同吗?

【问题讨论】:

  • 数组中的对象有多大?

标签: c++ arrays pthreads parallel-processing


【解决方案1】:

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

【讨论】:

  • 我是这样看的:虽然无数人可以同时看一杯水,但只有一个人可以喝水。
  • @Seth Carnegie:我只是不明白这与这里有什么关系
  • 接近对正确性没有影响,但由于现代内存层次结构的深度,它可以对性能发挥潜在的巨大作用。这种效果被称为“虚假共享”。引用 Herb Sutter 的名言:“消除虚假共享的几行代码将算法从零缩放到完美缩放”
  • 我不确定他们是否会同时尝试访问“超级”数组,否则会产生不良后果。
  • @yi_H 为什么不呢?这只是意味着您可以(同时)从多个线程读取数据,但只能从一个线程写入数据。
【解决方案2】:

是的,但要小心false sharing

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      如果您创建一个包含 10 个较小数组的“母数组”,并且每个线程仅访问其中一个数组,则不会发生任何坏事。这些数组元素的大小无关紧要。

      如果你使用更复杂的结构而不是数组,如果读取不会改变任何东西,那么你也是安全的。但是,如果对结构的简单读取可以修改它(例如,某些内容被缓存、重组),则让并行线程访问母结构可能会出现问题。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-02-13
        • 2018-07-11
        • 2021-10-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-12
        • 1970-01-01
        相关资源
        最近更新 更多