【发布时间】:2018-02-24 09:09:57
【问题描述】:
package main
var fooRunning = false
var barRunning = false
func foo() {
fooRunning = true
defer func() { fooRunning = false }()
if barRunning {
// wait for bar() to finish
}
...
}
func bar() {
barRunning = true
defer func() { barRunning = false }()
if fooRunning {
// wait for foo() to finish
}
...
}
在我的情况下,如果我们运行go foo(),它应该等待bar() 完成,反之亦然。最好的方法是什么?请注意,它们也可以独立执行。
【问题讨论】:
-
这些要求导致必须正确处理大量竞争条件(如果其他例程在您的正检查后立即结束怎么办?如果其他人在负检查后立即开始另一个例程等怎么办? . 如果有人运行 foo() 的 2 个例程怎么办?我强烈建议您创建一个更好的设计,让您没有 2 个相互依赖于另一个独立运行状态的 goroutine。
-
问题中的代码具有@nos 指出的设计死锁。没有适用于给定场景的解决方案。