【发布时间】:2014-01-17 06:42:48
【问题描述】:
我正在查看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)
}
我可以使用互斥锁或信号量,类似于我使用C 或Python 所做的,尽管我想利用Go 中的通道。
**更新
添加WaitGroup 会改变程序流程吗?我添加了一个WaitGroup,效果很好。虽然,我在整个for循环之后添加了Done()函数,那么整个increment会在decrement之前运行吗?我有点希望它们尽可能“并行”运行,我知道只有一个例程可以访问我,但我希望它们彼此独立运行。
【问题讨论】:
-
Go 为您提供了多种同步方式:通道、互斥体、等待组、原子。通道非常适合 goroutine 之间的通信、向工作人员发送数据等。使用什么取决于任务。使用最清晰的代码。
标签: concurrency parallel-processing synchronization go