规则很简单:如果多个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()



