gpt4 book ai didi

multithreading - 自同步 Goroutines 以死锁告终

转载 作者:数据小太阳 更新时间:2023-10-29 03:29:41 24 4
gpt4 key购买 nike

我有一个压力测试问题,想通过 Go 中的简单同步来解决。到目前为止,我已经尝试查找关于我在 Go 中同步的特定用例的文档,但没有找到合适的文档。

更具体一点:我必须完成一项任务,我必须在主例程中启动大量线程(在此示例中仅使用两个线程进行说明)。所有被启动的worker都应该以无序的方式自己准备一些初始化 Action 。直到它们到达一个小的命令序列,我希望所有的 goroutines 一次执行它们,这就是为什么我想要让 goroutines 相互同步。对我的任务来说非常重要的是,通过实例化所有其他 goroutine 的主例程的延迟不会影响工作人员执行的真正并行性(在注释中的标签#maximum parallel 处)。为此,我确实使用主例程中运行的 goroutines 的数量初始化了一个 WaitGroup ,并将其传递给所有例程,以便它们可以同步彼此的工作流。

代码看起来类似于这个例子:

import sync

func worker_action(wait_group *sync.WaitGroup) {
// ...
// initialization
// ...

defer wait_group.Done()
wait_group.Wait() // #label: wait

// sequence of maximum parallel instructions // #label: maximum parallel

// ...
}

func main() {
var numThreads int = 2 // the number of threads shall be much higher for the actual stress test

var wait_group sync.WaitGroup
wait_group.Add(numThreads)
for i := 0; i < numThreads; i++ {
go worker_action(&wait_group)
}

// ...
}

不幸的是,一旦所有 goroutine 都到达 Wait 指令(在注释中标有#wait),我的设置就会陷入僵局。对于我从主例程开始的任何数量的线程都是如此(即使是两个线程也会立即陷入死锁)。

从我的角度来看,死锁不应该发生,因为在等待指令之前,每个 goroutine 都会在同一个 WaitGroup 上执行 done 函数。

我是否对 WaitGroup 的工作方式有错误的理解?例如,是否不允许在主例程以外的 goroutine 内部执行等待函数?或者有人可以提示我还缺少什么吗?

非常感谢您。

编辑:

非常感谢@tkausl。确实是不必要的“延迟”导致了问题。我不知道我自己怎么看不到。

最佳答案

您的代码中存在多个问题。首先是表格。地道的 Go 应该使用驼峰命名法。 wg 是 WaitGroup 的更好名称。

但更重要的是在代码等待的地方使用。不在你的 Goroutine 中。它应该在主函数中等待:

func workerAction(wg *sync.WaitGroup) {
// ...
// initialization
// ...

defer wg.Done()
// wg.Wait() // #label: wait

// sequence of maximum parallel instructions // #label: maximum parallel

// ...
}

func main() {
var numThreads int = 2 // the number of threads shall be much higher for the actual stress test

var wg sync.WaitGroup
wg.Add(numThreads)
for i := 0; i < numThreads; i++ {
go workerAction(&wg)
}
wg.Wait() // you need to wait here

// ...
}

关于multithreading - 自同步 Goroutines 以死锁告终,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53127050/

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