前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >go 协程三种同步实现

go 协程三种同步实现

作者头像
运维开发王义杰
发布2023-08-21 11:15:08
2620
发布2023-08-21 11:15:08
举报
文章被收录于专栏:运维开发王义杰

golang 协程的示例代码有以下几种:

  1. 使用 sync.WaitGroup 来等待协程完成任务,例如:
代码语言:javascript
复制
package main

import (
  "fmt"
  "sync"
)

func add(a, b int) {
  var c = a + b;
  fmt.Printf("%d + %d = %d\n", a, b, c)
}

func main() {
  var wg sync.WaitGroup
  fmt.Println("我是main")
  wg.Add(1)
  go func(i int) {
    defer wg.Done()
    add(i)
  }(1)
  wg.Wait()
  fmt.Println("执行完了")
}
  1. 使用带缓冲的 channel 来控制协程的流程,例如:
代码语言:javascript
复制
package main

import (
  "fmt"
)

func add(a, b int) {
  var c = a + b;
  fmt.Printf("%d + %d = %d\n", a, b, c)
}

func main() {
  ch := make(chan bool, 1)
  fmt.Println("我是main")
  go func(i int, chp chan<- bool) {
    defer close(chp)
    add(i)
    fmt.Println("finish")
    chp <- true
  }(1, ch)
  fmt.Println("wait")
  <-ch
  fmt.Println("执行完了")
}
  1. 使用 sync.Cond 来实现协程的同步,例如:
代码语言:javascript
复制
package main

import (
  "fmt"
  "sync"
)

func add(a, b int) {
  var c = a + b;
  fmt.Printf("%d + %d = %d\n", a, b, c)
}

func main() {
  var locker = new(sync.Mutex)
  var cond = sync.NewCond(locker)
  var done bool = false
  fmt.Println("我是main")
  cond.L.Lock()
  go func(i int) {
    add(i)
    fmt.Println("finish")
    done = true
    cond.Signal()
  }(1)
  fmt.Println("wait")
  if !done {
    cond.Wait()
    cond.L.Unlock()
  }
  fmt.Println("执行完了")
}

这段代码的逻辑是这样的:

  • 在主函数中,创建一个互斥锁和一个条件变量,以及一个 done 标志位。
  • 在主函数中,调用 cond.L.Lock() 来获取锁,然后启动一个协程来执行 add 函数,并在完成后设置 done 为 true,并调用 cond.Signal() 来通知等待的协程。
  • 在主函数中,调用 fmt.Println(“wait”) 来打印等待信息,然后判断 done 是否为 false,如果是,则调用 cond.Wait() 来阻塞当前协程,并释放锁,等待信号。
  • 当子协程执行完 add 函数后,调用 time.Sleep(time.Duration(1 * time.Minute)) 来模拟一些耗时操作,然后调用 cond.Signal() 来发送信号,并退出协程。
  • 当主协程收到信号后,调用 cond.L.Unlock() 来释放锁,然后调用 fmt.Println(“执行完了”) 来打印结束信息,并退出主函数。
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-03-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 运维开发王义杰 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档