登录
首页 >  Golang >  Go问答

等待所有 goroutine 完成后释放锁

来源:stackoverflow

时间:2024-02-24 08:36:24 182浏览 收藏

一分耕耘,一分收获!既然都打开这篇《等待所有 goroutine 完成后释放锁》,就坚持看下去,学下去吧!本文主要会给大家讲到等等知识点,如果大家对本文有好的建议或者看到有不足之处,非常欢迎大家积极提出!在后续文章我会继续更新Golang相关的内容,希望对大家都有所帮助!

问题内容

下面是一段用 go 编写的代码,摘自 raft locking advice,规则 5:

rf.mu.Lock()
  rf.currentTerm += 1
  rf.state = Candidate
  for  {
    go func() {
      rf.mu.Lock()
      args.Term = rf.currentTerm
      rf.mu.Unlock()
      Call("Raft.RequestVote", &args, ...)
      // handle the reply...
    } ()
  }
  rf.mu.Unlock()

raft是一些共识算法,rf指的是raft。上面的代码试图做的是领导者向其所有对等方发送 rpc 请求以请求投票。正如代码后面的段落所指出的,此代码并不理想,因为 rf.currentterm 可能在子例程被触发之前已经被更改。我们的目标是让 rf 的状态在其同行投票时保持不变。

我的补救措施是使用等待组让代码在最后一个 rf.mu.unlock 之前等待。这肯定会解决提到的问题。然而,建议中的规则 4 指出:在执行任何可能 wait 的操作时,it 通常不是一个好主意。

文章提出的解决方案如下:

解决这个问题的一种方法是让创建的 goroutine 使用外部代码持有锁时制作的 rf.currentterm 副本。

但我不太确定这意味着什么。


解决方案


您可以将参数传递给 go 例程函数,例如:

  rf.mu.Lock()
  rf.currentTerm += 1
  rf.state = Candidate
  for  {
    go func(ct CurrentTerm) {
      rf.mu.Lock()
      args.Term = ct
      rf.mu.Unlock()
      Call("Raft.RequestVote", &args, ...)
      // handle the reply...
    } (rt.currentTerm)
  }
  rf.mu.Unlock()

如果不了解您要实现的目标,我不确定这是否是最佳解决方案。

理论要掌握,实操不能落!以上关于《等待所有 goroutine 完成后释放锁》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>