[Go] golang互斥锁mutex

1.互斥锁用于在代码上创建一个临界区,保证同一时间只有一个goroutine可以执行这个临界区代码

2.Lock()和Unlock()定义临界区

package main

import (
        "fmt"
        "runtime"
        "sync"
)

var (
        //全局变量
        counter int64
        //计数信号量
        wg sync.WaitGroup
        //mutex定义一段代码临界区
        mutex sync.Mutex
)

func main() {
        fmt.Println("hello")
        //计数加2,等待两个goroutine
        wg.Add(2)
        go incCounter()
        go incCounter()
        //主goroutine等待子goroutine结束
        wg.Wait()
        fmt.Println("最终counter值:", counter)
}

//增加counter的值函数
func incCounter() {
        //函数结束,减小信号量
        defer wg.Done()
        for count := 0; count < 2; count++ {
                //创建这个临界区
                //同一时刻只允许一个goroutine进入
                mutex.Lock()
                //使用大括号只是为了让临界区看起来更清晰,并不是必须的
                {
                        value := counter
                        //强制调度器切换
                        runtime.Gosched()
                        value++
                        counter = value
                }
                mutex.Unlock()
        }
}