sync.Mutex重复加锁问题

zhangmingkai4315 · · 1843 次点击 · 开始浏览    置顶
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。

一段Go的并发锁实例程序,程序如下所示, 实现的是安全并发的去更新一个计数器的功能。整个程序输出结果与预期一致,但是问题是执行的顺序:感觉输出结果与预料的不太一样,而且加锁的顺序也跟预期不一致。 ```go var ( counter int wg sync.WaitGroup mutex sync.Mutex ) func incCounter(id int) { defer wg.Done() for count := 0; count < 2; count++ { mutex.Lock() println("id=", id, " lock the mutex") println("id=", id, " counter=", counter) value := counter println("id=", id, " switch to another goroutine") runtime.Gosched() value++ counter = value mutex.Unlock() println("id=", id, " unlock the mutex") } } func main() { runtime.GOMAXPROCS(2) wg.Add(2) go incCounter(1) go incCounter(2) wg.Wait() fmt.Printf("final counter %d\n", counter) } ``` 整个的输出如下面所示,比较奇怪的是第四行的锁,竟然在没有释放的时候再次被锁定?请各位大佬帮看下,是否哪里出了问题,还是我对于锁理解错了。 程序并发执行,所以这个输出结果不是100%如下面的一样,有一定概率出现下面的输出。 ```go ➜ sync-example go run main.go id= 2 lock the mutex id= 2 counter= 0 id= 2 switch to another goroutine id= 1 lock the mutex id= 1 counter= 1 id= 1 switch to another goroutine id= 1 unlock the mutex id= 1 lock the mutex id= 1 counter= 2 id= 1 switch to another goroutine id= 1 unlock the mutex id= 2 unlock the mutex id= 2 lock the mutex id= 2 counter= 3 id= 2 switch to another goroutine id= 2 unlock the mutex final counter 4 ```

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1843 次点击  
加入收藏 微博
5 回复  |  直到 2019-12-26 19:16:50
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传