我在Google Go构建实时系统时正在研究该语言,我发现通过渠道共享资源有点混乱。我试图为了理解,让不同的goroutines人增加和减少共享值相同的次数,最终为 0。我知道我的代码是错误的,但我并没有真正掌握它。有人愿意解释这里有什么问题吗?
package main
import (
. "fmt"
. "runtime"
)
func increment(c chan int) {
for x := 0; x < 10; x++ {
a := <-c
a++
c <- a
}
}
func decrement(c chan int) {
for x := 0; x < 10; x++ {
a := <-c
a--
c <- a
}
}
func main() {
GOMAXPROCS(NumCPU())
c := make(chan int)
go increment(c)
go decrement(c)
Println(<-c)
}
我可以使用互斥锁或信号量,类似于我使用Cor 的方式Python,尽管我想利用Go.
**更新
添加会WaitGroup改变程序流程吗?我加了一个WaitGroup,效果很好。虽然,我Done()在整个 for 循环之后添加了该函数,那么整个循环会在increment之前运行decrement吗?我有点希望它们尽可能地“并行”运行,我知道只有一个例程可以访问 I,但我希望它们彼此独立运行。
相关分类