我是GoLang的学习者,正在尝试进行实验并了解Sync软件包和chan概念。
我正在运行的代码是期望在控制台上打印“接收通道值”的代码,但是该值未得到打印,它有时但并非总是打印该值。
如果我不使用chan遍历chan,那么它会打印所有通道值,但会失败,并显示错误“致命错误:所有goroutine都处于睡眠状态-死锁! ”
我尝试使用通道“完成”来同步通道读取,但是在这种情况下,它再次因相同的错误而开始失败。我还尝试了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主要方法完成
元芳怎么了
相关分类