Golang并发数组访问

Kr0*_*r0e 9 concurrency synchronization locking thread-safety go

从多个goroutine访问同一个数组是否安全,当每个goroutine在一个切片上工作时,指向相同的底层数组但没有重叠?

喜欢:

var arr [100]int
sliceA := arr[:50]
sliceB := arr[50:]

go WorkOn(sliceA)
go WorkOn(sliceB)
Run Code Online (Sandbox Code Playgroud)

想象一下"WorkOn"会做些什么.

jim*_*imt 8

只要你能保证区域不会重叠,那就没问题了.

担保我的意思是:任何人的作品上sliceA,应该不会被允许做sliceA = append(sliceA, a, b, c).因为那时它将开始进入sliceB领土.

相关的是Go 1.2的一些文档:这涉及一个新的语言元素:3索引切片:

Go 1.2增加了在现有数组或切片上使用切片操作时指定容量和长度的功能.切片操作通过描述已创建的数组或切片的连续部分来创建新切片:

var array [10]int
slice := array[2:4]
Run Code Online (Sandbox Code Playgroud)

切片的容量是切片可以保持的最大元素数,即使在重新切换之后也是如此; 它反映了底层数组的大小.在此示例中,slice变量的容量为8.

Go 1.2添加了新语法,允许切片操作指定容量和长度.第二个冒号引入容量值,该值必须小于或等于源切片或阵列的容量,并根据原点进行调整.例如,

slice = array[2:4:7]
Run Code Online (Sandbox Code Playgroud)

将切片设置为与前面示例中的长度相同,但其容量现在只有5个元素(7-2).无法使用此新切片值访问原始数组的最后三个元素.

在这个三索引表示法中,缺少的第一个索引([:i:j])默认为零,但必须始终明确指定其他两个索引.Go的未来版本可能会为这些索引引入默认值.

进一步的细节在设计文件中.