【发布时间】:2019-01-05 15:36:34
【问题描述】:
我是 GoLang 的学习者,正在尝试尝试和了解 Sync 包和 chan 概念。
以下是我正在运行并希望在控制台上打印接收渠道值的代码,但该值没有被打印出来,它有时会打印这些值,但并非总是如此。
如果我通过 chan 而不将其放入 go 例程中,那么它会打印所有通道值但失败并出现错误“致命错误:所有 goroutines 都处于睡眠状态 - 死锁!”
我尝试使用通道“完成”同步通道读取,但在这种情况下,它再次开始失败并出现相同的错误。我还尝试了 waitGroup API,您可以在我的代码中看到(已注释),但这对我也不起作用。
感谢您的帮助
源代码:
package main
import (
"fmt"
"sync"
)
type safeOperation struct {
i int
sync.Mutex
}
var wg sync.WaitGroup
func main() {
so := new(safeOperation)
ch := make(chan int)
//done := make(chan bool)
for i := 0; i < 5; i++ {
go so.Increment(ch)
go so.Decrement(ch)
}
go func() {
//wg.Add(1)
for c := range ch {
fmt.Println("Receiving Channel Value: ", c)
}
//wg.Done()
//done <- true
}()
//wg.Wait()
//<-done
fmt.Println("Value: ", so.GetValue())
fmt.Println("Main method finished")
}
func (so *safeOperation) Increment(ch chan int) {
//so.Lock()
//defer wg.Done()
so.i++
ch <- so.i
//so.Unlock()
}
func (so *safeOperation) Decrement(ch chan int) {
//so.Lock()
//defer wg.Done()
so.i--
ch <- so.i
//so.Unlock()
}
func (so *safeOperation) GetValue() int {
so.Lock()
v := so.i
so.Unlock()
return v
}
输出: 值:1 主方法完成
【问题讨论】:
标签: go