当前位置: 首页 > 面试题库 >

我可以同时写不同的slice元素吗

云弘壮
2023-03-14
问题内容

我有一个包含要完成的工作的切片,以及一个包含所有完成后的结果的切片。以下是我的一般流程的草图:

var results = make([]Result, len(jobs))
wg := sync.WaitGroup{}
for i, job := range jobs {
    wg.Add(1)
    go func(i int, j job) {
        defer wg.Done()
        var r Result = doWork(j)
        results[i] = r
    }(i, job)
}
wg.Wait()
// Use results

它似乎可行,但我尚未对其进行全面测试,因此不确定这样做是否安全。通常,让多个goroutine写入 任何内容
不会让我感觉很好,但是在这种情况下,每个goroutine仅限于片中自己的索引(已预先分配)。

我认为替代方法是通过渠道收集结果,但是由于结果的顺序很重要,所以这似乎很简单。这样写切片元素是否安全?


问题答案:

规则很简单:如果多个goroutines
同时访问一个变量,并且至少其中之一是写操作,则需要同步。

您的示例不违反此规则。您无需写入切片 (slice标头),而仅读取它(隐式地在索引时)。

您不阅读slice 元素 ,只修改了slice元素。并且每个goroutine仅修改单个, 不同的指定的
slice元素。而且,由于每个slice元素都有其自己的地址(自己的内存空间),因此它们就像不同的变量。规格:变量中对此进行了介绍:

__array
,slice和struct类型的
结构化 变量具有可以单独处理的元素和字段。
每个这样的元素就像一个变量。

必须记住的是,如果不results进行同步,则无法从切片中读取结果。您在示例中使用的等待组是足够的同步。一旦wg.Wait()返回,就可以读取切片,因为只有在所有工作程序goroutine都调用之后才能发生该操作wg.Done(),并且所有工作程序goroutine
都不能在调用之后修改元素wg.Done()

例如,这是检查/处理结果的有效( 安全 )方法:

wg.Wait()
// Safe to read results after the above synchronization point:
fmt.Println(results)

但是,如果您尝试访问resultsbefore 的元素wg.Wait(),那就是一场数据竞赛:

// This is data race! Goroutines might still run and modify elements of results!
fmt.Println(results)
wg.Wait()


 类似资料:
  • 问题内容: 这样的情况有效吗? 问题答案: 没有。 元素ID在整个文档中应该是唯一的。

  • 问题内容: 同一元素是否可以有多个伪元素? 我正在尝试使用jQuery将上述样式应用于相同的元素,但仅应用了最新样式,从未应用过这两种样式。 问题答案: 在CSS2.1中,一个元素在任何时候最多只能具有任何一种伪元素。(这意味着一个元素可以同时具有a 和一个伪元素- 每种元素不能超过一个。) 结果,当您有多个匹配同一元素的规则时,它们将全部层叠并应用于单个伪元素,就像普通元素一样。在您的示例中,最

  • 我正在使用Windows上的Eclipse IDE(氧气)学习Java(SE8)。我以前做过一些“业余”编程,但这是我第一次正式上这门课。我希望能够在普通控制台(System.out.println)中打印分配所需的输出,并同时在不同的控制台中打印正在发生的信息文本。 printToConsole1(“普通程序输出”);printToConsole2(“幕后信息”); 我可以在Java中做类似的事

  • 问题内容: 这是场景: ThreadA将要从某些套接字读取,并将数据写入“ MyFile.txt” ThreadB将读取“ MyFile”,到达末尾时,它将循环播放,直到MyFile中有新数据可用为止(因为我不想重新打开“ MyFile.txt”,并且浪费时间,所以我到达了从我所在的位置..)。 可以做这样的事情吗? 如果没有,还有其他方法可以做这种事情吗? 问题答案: 您提到的问题是著名的生产者

  • 本文向大家介绍可替换元素和不可替换元素有什么不同的特点?相关面试题,主要包含被问及可替换元素和不可替换元素有什么不同的特点?时的应答技巧和注意事项,需要的朋友参考一下 可替换元素的内容由元素的某些属性的值决定 不可替换元素的内容由子节点的内容决定

  • 我有下面的xml结构: 有不同的 Field(X) 包装器元素,它们包含相同的用户元素。XML 中可以发送 n 个字段。因此,我不能为每个单独的Jaxb。我需要访问用户,但在取消编组步骤后忽略 Field 元素。不幸的是,我无权更改xml结构。我无法找到解决方案。任何指针都会有所帮助。