Golang 中 在gmp下,mutex 是如何并发的
在Go中,sync.Mutex
是一个互斥锁,它确保同一时刻只有一个goroutine可以进入一个锁保护的区域。当一个goroutine获得了互斥锁,在它释放这个锁之前,其他的goroutine将无法进入这个区域。
当多个goroutine并发访问一个共享资源时,为了避免竞态条件(如竞争条件),我们需要一种方法来同步这些goroutines的访问。这就是sync.Mutex
发挥作用的地方。
下面是一个简单的例子,展示了如何在Go中使用sync.Mutex
来确保并发安全:
package main
import (
"fmt"
"sync"
"time"
)
var (
counter int
mutex sync.Mutex
)
func increment(wg *sync.WaitGroup) {
defer wg.Done() // 告诉WaitGroup该goroutine已经完成
mutex.Lock() // 获取互斥锁
counter++
mutex.Unlock() // 释放互斥锁
}
func main() {
var wg sync.WaitGroup
start := time.Now()
for i := 0; i < 1000; i++ {
wg.Add(1)
go increment(&wg)
}
wg.Wait() // 等待所有goroutine完成
elapsed := time.Since(start)
fmt.Printf("Counter: %d\n", counter)
fmt.Printf("Time taken: %s\n", elapsed)
}
在这个例子中,我们有一个全局变量counter
和一个互斥锁mutex
。increment
函数会被并发调用,每次调用都会对counter
进行递增操作。通过使用mutex.Lock()
和mutex.Unlock()
,我们确保了同一时间只有一个goroutine可以进入临界区并修改counter
,从而保证了操作的原子性。
这就是在Go中使用sync.Mutex
进行并发控制的基本方法。
评论已关闭