2d切片的线程安全性,其中每个线程在第一维中获得其自己的索引

问题描述 投票:2回答:1

我试图最终得到一个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附加到他们自己的列表中,或者是否应该在互斥锁中发生追加?

multithreading go slice
1个回答
1
投票

如果你的goroutine数量是恒定的,并且每个goroutine只是改变它自己的“数据”,那么你的原始方法是线程安全的。

我的第一直觉是认为这是好的,但如果两个go-routines同时需要附加到各自的列表,这意味着我同时写入第一个维度切片。

您可能正在同时写入该片,但是您正在更新后备阵列中的不同索引,并且如果您不需要增长该片,则后备阵列将不会移动。

© www.soinside.com 2019 - 2024. All rights reserved.