Go语言---并发编程以及资源竞争(goroutine、runtime)
package main
import (
"fmt"
"runtime"
"sync"
"sync/atomic"
"time"
)
var (
// 定义一个全局变量counter
counter int32
// 创建一个互斥锁
lock sync.Mutex
)
func increment() {
// 对counter进行原子增加
atomic.AddInt32(&counter, 1)
}
func worker(id int, wg *sync.WaitGroup) {
// 模拟工作时间
time.Sleep(time.Millisecond * 500)
// 使用互斥锁保护临界区操作
lock.Lock()
increment()
lock.Unlock()
// 通知主goroutine工作已完成
wg.Done()
}
func main() {
// 设置Go程的最大数目
runtime.GOMAXPROCS(1)
// 创建一个用于同步的WaitGroup
var wg sync.WaitGroup
// 循环启动多个goroutine
for i := 0; i < 1000; i++ {
wg.Add(1)
go worker(i, &wg)
}
// 等待所有goroutine完成任务
wg.Wait()
// 打印counter的最终值
fmt.Println("Final Counter Value:", counter)
}
这段代码使用了Go语言的goroutine和互斥锁来处理并发场景下的计数问题。通过sync/atomic
包中的AddInt32
函数原子性地增加计数器,避免了使用互斥锁带来的性能开销。代码中使用了sync.WaitGroup
来同步所有goroutine的完成,并在主goroutine中打印出最终的计数值。这是一个很好的并发编程示例,展示了Go语言中并发的处理方式。
评论已关闭