gpt4 book ai didi

multithreading - 二维 slice 的线程安全性,其中每个线程在第一维中都有自己的索引

转载 作者:IT王子 更新时间:2023-10-29 01:44:29 25 4
gpt4 key购买 nike

我试图最终得到一个二维 slice ,其中第一个维度等于使用的 go-routines 的数量,第二个维度是每个 go-routine 负责写入的结构列表。

类型:

[][]*Node

每个 go-routine 都将被赋予二维 slice 中第一个维度的索引,并且只会在其索引处附加到列表中。

我的第一直觉是认为这没问题,但如果两个 go-routines 同时需要追加到它们各自的列表,这意味着我正在同时写入第一维 slice 。

我在想指向第二个列表的指针而不是使用原始列表可能会减轻这种并发写入......像这样:

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 仅更改其“自己的”数据,那么您的原始方法是线程安全的。

My first instinct was to think this was ok, but if two go-routines simultaneously need to append to their respective lists, this means I am concurrently writing to the first dimension slice.

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

关于multithreading - 二维 slice 的线程安全性,其中每个线程在第一维中都有自己的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47842345/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com