我有一个包含要完成的工作的切片,以及一个包含所有完成后的结果的切片。以下是我的一般流程的草图:
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)
但是,如果您尝试访问results
before 的元素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结构。我无法找到解决方案。任何指针都会有所帮助。