我试图最终得到一个2D切片,其中第一个维度等于所使用的go例程的数量,第二个维度是每个go-routine负责写入的结构列表。
类型:
[][]*Node
每个go-routine将被赋予第2个切片中第一个维度的索引,并且只会附加到其索引处的列表中。
我的第一直觉是认为这是好的,但如果两个go-routines同时需要附加到各自的列表,这意味着我同时写入第一个维度切片。
我正在考虑指向第二个列表,而不是使用原始列表可能会缓解这个并发写入...类似于:
workCollector := make([]*[]*Node, 5)
for i ; i < 5; i++ {
go.Process(i)
}
func Process(threadNum int){
localList := workCollector[threadNum]
*localList = append(*localList, NewNode(UUID.()))
}
这是否足以允许每个go-routine附加到他们自己的列表中,或者是否应该在互斥锁中发生追加?
如果你的goroutine数量是恒定的,并且每个goroutine只是改变它自己的“数据”,那么你的原始方法是线程安全的。
我的第一直觉是认为这是好的,但如果两个go-routines同时需要附加到各自的列表,这意味着我同时写入第一个维度切片。
您可能正在同时写入该片,但是您正在更新后备阵列中的不同索引,并且如果您不需要增长该片,则后备阵列将不会移动。