golang mysql 死锁_Go语言死锁、活锁和饥饿概述

本文详细介绍了Go语言中死锁、活锁和饥饿的概念,通过实例代码展示了死锁如何产生,并解释了Coffman条件。同时,通过一个走廊相遇的示例说明了活锁的出现,最后探讨了饥饿问题,指出它可能导致程序性能下降或不正确运行。文章强调在并发编程中避免这些问题的重要性。
摘要由CSDN通过智能技术生成

typevaluestruct{musync.Mutexvalueint}varwgsync.WaitGroupprintSum:=func(v1,v2*value){deferwg.Done()v1.mu.Lock()//在这里,我们尝试进入临界区来传入一个值。deferv1.mu.Unlock()//在这里,我们使用defer语句在printSum返回之前退出临界区。time.Sleep(2*time.Second)//在这里,我们休眠了一段时间来模拟一些工作(并触发死锁)v2.mu.Lock()deferv2.mu.Unlock()fmt.Printf("sum=%vn",v1.value+v2.value)}vara,bvaluewg.Add(2)goprintSum(&a,&b)goprintSum(&b,&a)wg.Wait()

如果尝试运行此代码,可能会看到:fatalerror:allgoroutinesareasleep-deadlock!

为什么呢?如果仔细观察,就可以在此代码中看到时机问题。以下是运行时的图形表示。这些框表示函数,水平线表示调用这些函数,竖线表示图形头部的函数生存时间,如下图所示。

68e55b45677dc77f6cfbf6e6aa3ed609.gif

图:一个因时间问题导致死锁的演示

本质上,我们创建了两个不能转动的齿轮:第一次调用printSum锁定a,然后试图锁定b,但在此期间,第二次调用printSum己锁定b并试图锁定a。这两个goroutine都无限地等待着。

以图形的方式展示为什么会出现死锁似乎很明确,但是更严格的定义会给我们带来更多的好处。事实证明,出现死锁有几个必要条件。1971年,EdgarCoffman在一篇论文中列举了这些条件。这些条件现在被称为Coffman条件,是帮助检测、防止和纠正死锁的技术依据。

Coffman条件如下:

相互排斥:井发进程同时拥有资源的独占权。

等待条件:并发进程必须同时拥有一个资源,并等待额外的资源。

没有抢占:并发进程拥有的资掘只能被该进程释放,即可满足这个条件。

循环等待:一个并发进程(P1)必须等待一系列其他井发进程(P2),这些并发进程同时也

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值