【发布时间】:2020-01-08 07:43:42
【问题描述】:
我正在阅读一本关于 Go 并发的书(我现在正在学习它),我发现了这段代码:
c := sync.NewCond(&sync.Mutex{})
queue := make([]interface{}, 0, 10)
removeFromQueue := func(delay time.Duration) {
time.Sleep(delay)
c.L.Lock()
queue = queue[1:]
fmt.Println("Removed from queue")
c.L.Unlock() c.Signal()
}
for i := 0; i < 10; i++ {
c.L.Lock()
// Why this loop?
for len(queue) == 2 {
c.Wait()
}
fmt.Println("Adding to queue")
queue = append(queue, struct{}{})
go removeFromQueue(1*time.Second)
c.L.Unlock()
}
问题是我不明白作者为什么要引入注释标记的for循环。据我所知,如果没有它,程序是正确的,但作者说循环存在是因为Cond 会发出信号表示仅发生了某些事情,但这并不意味着状态已经真正改变了。
在什么情况下可能?
【问题讨论】:
-
这是哪本书?
-
"没有它,程序是正确的" 程序什么都不做,所以它不可能是“正确的”。我认为代码可以展示 Signal 和 Wait 如何协同工作。此代码是 Signal and Wait only 的示例,其余代码用于展示这些函数如何工作。如果没有它们,其余的代码就不会工作。它的存在只允许 Signal 和 Wait 存在。
-
你确定
for循环的代码没有在单独的 goroutine 中执行吗? -
@kostix 代码完全按照书中的内容复制。
-
@marco.m Katherine Cox-Buday 撰写的“Go 并发”。
标签: go concurrency goroutine