Mutex 的使用
1. 互斥锁的实现机制
1.1 临界区
为了避免并发访问导致的意外,被保护起来的程序叫做临界区。
1.2 互斥锁
保证临界区只能同时被一个线程持有。
1.3 互斥锁的原理
临界区被一个线程持有的时候,其他想进入临界区的线程会返回失败,或者等待。直到持有的线程退出临界区。
1.4 同步元语的使用场景
- 共享资源。并发地读写共享资源。
- 任务编排。互相等待或有依赖的线程。
- 消息传递。不同线程之间传递消息。
2. Mutex 的基本使用方法
2.1 示例代码
package main
import (
"fmt"
"sync"
)
func main() {
// 互斥锁保护计数器
var mu sync.Mutex
// 计数器的值
var count = 0
// 辅助变量,用来确认所有的goroutine都完成
var wg sync.WaitGroup
wg.Add(10)
// 启动10个gourontine
for i := 0; i < 10; i++ {
go func() {
defer wg.Done()
// 累加10万次
for j := 0; j < 100000; j++ {
// 加锁
mu.Lock()
count++
// 释放锁
mu.Unlock()
}
}()
}
wg.Wait()
fmt.Println(count)
}