通道将通信(值的交换)与同步相结合,以确保两个计算(goroutines)处于已知状态。
如何使用Google Go中的频道执行互斥功能?
package main import "sync" var global int = 0 var m sync.Mutex func thread1(){ m.Lock() global = 1 m.Unlock() } func thread2(){ m.Lock() global = 2 m.Unlock() } func main(){ go thread1() go thread2() }
将通道用作互斥对象的示例:
package main var global int = 0 var c = make(chan int, 1) func thread1(){ <-c // Grab the ticket global = 1 c <- 1 // Give it back } func thread2(){ <-c global = 2 c <- 1 } func main() { c <- 1 // Put the initial value into the channel go thread1() go thread2() }
您也可以使用chan struct{}而不是chan int减小内存大小。输入的值是struct{}{}(type struct{}和一个空的content {})。有关示例,请参见Ivan black的评论。
chan struct{}
chan int
struct{}{}
struct{}
{}