• 杜鑫
    2020-11-19
    谢谢老师的文章!第一次知道有这两种并发原语,不管之后工作能不能用到,这都是对个人眼界的开阔! ps:老师的文章几乎都是一篇顶两篇,刚订阅的时候还担心课程内容太少,现在一看担心完全是多余的,这段时间读了老师的文章之后,个人对go并发知识了解更深刻了,谢谢老师!

    作者回复: 加油!

    
    13
  • 无名氏
    2022-03-19
    CyclicBarrier 那个测试例子没有看懂,2个H,一个O顺序怎么保证是HHO😅

    作者回复: hho,hoh,ohh,都可以,只有保证是一个水分子

    共 2 条评论
    1
  • Fan
    2020-12-28
    老师,在你github地址 https://github.com/smallnest/dive-to-gosync-workshop/tree/master/7.orchestration/water中没有搜到WaitGroup版本的H2O的例子,但是按照你正文中WaitGroup版本实现H2O,有报错panic: sync: WaitGroup is reused before previous Wait has returned 。请问老师这应该怎么解决呢?很困惑,望老师指点。

    作者回复: https://github.com/smallnest/dive-to-gosync-workshop/tree/master/7.orchestration/water

    共 2 条评论
    1
  • Fan
    2020-12-25
    老师,感觉你上面用waitGroup实现这个H2O的例子有问题的。我这边运行都panic的。

    作者回复: 报什么错?这些例子都是我运行过的,你也可以到github上搜我的一个项目叫workshop的代码

    共 4 条评论
    1
  • 伟伟
    2020-11-23
    package main import ( "context" "github.com/marusama/cyclicbarrier" "golang.org/x/sync/semaphore" ) type H2O2 struct { semaH *semaphore.Weighted semaO *semaphore.Weighted b cyclicbarrier.CyclicBarrier } func New() *H2O2 { return &H2O2{ semaH: semaphore.NewWeighted(2), semaO: semaphore.NewWeighted(2), b: cyclicbarrier.New(4), } } func (h2o2 *H2O2) hydrogen(releaseHydrogen func()) { h2o2.semaH.Acquire(context.Background(), 1) releaseHydrogen() h2o2.b.Await(context.Background()) h2o2.semaH.Release(1) } func (h2o2 *H2O2) oxygen(releaseOxygen func()) { h2o2.semaO.Acquire(context.Background(), 1) releaseOxygen() h2o2.b.Await(context.Background()) h2o2.semaO.Release(1) }
    展开

    作者回复: ������������

    
    1
  • 白开d水
    2023-03-23 来自北京
    为什么在 h2o.semaH.Acquire(context.Background(), 1) 1不能换成2呢,直接请求2个资源?

    作者回复: 每个goroutine只能出一个原子

    
    
  • 李晓清
    2023-03-17 来自北京
    package main import ( "context" "fmt" "time" "github.com/marusama/cyclicbarrier" ) var result chan string = make(chan string, 4) var barrier = cyclicbarrier.NewWithAction(4, func() error { fmt.Println(<-result, <-result, <-result, <-result) return nil }) var h = func() { for { time.Sleep(1 * time.Second) result <- "H" barrier.Await(context.TODO()) } } var o = func() { for { time.Sleep(1 * time.Second) result <- "O" barrier.Await(context.TODO()) } } func main() { go h() go h() go o() go o() select {} }

    作者回复: 如果没有tome.sleep,或者sleep很短,还可以吗

    
    
  • Geek8956
    2021-11-29
    老师,请问循环栏栅和cond并发原语有什么区别?他们都可以让多个协程等待某个条件满足,然后并发的开始执行。

    作者回复: 循环栅栏的重点是循环,重用

    
    
  • 老纪
    2020-12-08
    在CyclicBarrier中,是需要一组goroutine都执行到Await()方法后,才会都向下执行否则就会阻塞在Await()方法上吗

    作者回复: 是的

    
    
  • Linuxer
    2020-11-20
    感觉自已Go刚刚入门,我确实也才学习一周左右,看着挺爽,写起来还是不顺手,还得多练习,老师能否给我们这些打算转Go的新手一些建议,谢谢

    作者回复: 多实践,在项目中锻炼,很快就顺手了

    
    