请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

正在回答

3回答

同学理解的很对。的确是圈出的这几句的确是这样循环等待的关系,里面也考虑了requet的数量。值得提出的是,这个问题通常是无法通过增加worker的数量来解决的,只能暂时缓解。

0 回复 有任何疑惑可以回复我~
  • 提问者 LikeAShadow #1
    谢谢老师
    回复 有任何疑惑可以回复我~ 2018-04-19 09:26:33
  • 借用同学的图问一下,实际上是主routine卡在了6这个位置导致了result被接收,造成了循环等待了吗?问题的关键是不是因为接收和发送都在一个goruntine里面,导致如果只要接收和发送其中一个卡住就会导致循环等待?
    回复 有任何疑惑可以回复我~ 2019-11-15 12:56:17
  • 这是一个基本的死锁问题。虽然这里没有用到锁,但原理一样。
    
    死锁的四个必要条件
    
      1、互斥条件:一个资源每次只能被一个进程使用;
      2、请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放;
    
      3、不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺;
    
      4、循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系;
    
    互斥和不剥夺一般无法破除。循环等待正如图上已经形成。另一方面收发在一个goroutine里实际上造成了请求保持,就是您所说的。后面改成select也是主要对请求保持进行破解
    回复 有任何疑惑可以回复我~ 2019-11-16 15:49:46
晓之海绵宝宝 2018-05-28 18:24:35

举个例子:

以前是大家排队上厕所,排队的人把门都堵了,人家上完厕所想出来出不来,然后大家也进不去。现在每个人都在两边站着(这就是并发),排队的路没人堵了,人家能出来,大家才能进去嘛。

你要是有钱,也能开一排厕所(开n个worker),来了都有厕所上,也不会出现堵门的情况了。




3 回复 有任何疑惑可以回复我~
  • ccmouse #1
    这个解释比我的好多了
    回复 有任何疑惑可以回复我~ 2018-05-28 19:54:08
王子虾2021 2022-02-06 23:00:24

    确实这里的逻辑非常绕。。

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信