Select与Mutex
package main import ( "fmt" "time" ) func test5(a chan int) { time.Sleep(time.Second*3) a <- 1 } func test6(b chan int) { time.Sleep(time.Second*5) b <- 1 } func main(){ a := make(chan int) b := make(chan int) go test5(a) go test6(b) for{ //使用for循环 select{ case <-a: fmt.Println("test5执行完毕") return // 执行完毕返回 case <-b: fmt.Println("test6执行完毕") return default: fmt.Println("没有一个完成") } } }
Mutex 用于提供一种加锁机制(Locking Mechanism),可确保在某时刻只有一个协程在临界区运行,以防止出现竞态条件。
Mutex 可以在 [sync] 包内找到。[Mutex] 定义了两个方法:[Lock]和 [Unlock](。所有在 Lock
和 Unlock
之间的代码,都只能由一个 Go 协程执行,于是就可以避免竞态条件。
package main import ( "fmt" "sync" ) var x = 0 func increment(wg *sync.WaitGroup,m *sync.Mutex) { m.Lock() x = x + 1 m.Unlock() wg.Done() } func main() { var w sync.WaitGroup var m sync.Mutex //值类型,传递地址 for i := 0; i < 1000; i++ { w.Add(1) go increment(&w,&m) } w.Wait() fmt.Println("final value of x", x) }