• 属鱼
    2018-10-12
    个人理解,不确定对不对,请老师评判一下:
    因为Go语言传递对象时,使用的是浅拷贝的值传递,所以,当传递一个Cond对象时复制了这个Cond对象,但是低层保存的L(Locker类型),noCopy(noCopy类型),notify(notifyList类型),checker(copyChecker)对象的指针没变,因此,*sync.Cond和sync.Cond都可以传递。

    作者回复: 基本正确。Locker是接口,是引用类型,nocopy是结构体,所以直接拷贝值的话,底层锁还是用的同一个,使用上容易出问题。

    
     13
  • hello peter
    2018-10-26
    老师, 感觉这个送信的例子似乎用chanel实现更简单.在网上也查了一些例子, 发现都可以用chanel替代. 那使用sync.Cond 的优势是什么呢, 或者有哪些独特的使用场景?

    作者回复: 优势是并发流程上的协同,chan的主要任务是传递数据。另外cond是更低层次的工具,效率更高一些,但是肯定没有chan方便。

    
     7
  • 文@雨路
    2018-10-12
    指针可以传递,值不可以,传递值会拷贝一份,导致出现两份条件变量,彼此之间没有联系
    
     4
  • Geek_a8be59
    2019-08-12
    var mailbox uint8
    var lock sync.RWMutex
    sendCond := sync.NewCond(&lock)
    recvCond := sync.NewCond(&lock)
    为什么不能向上面那样都用同一个互斥量,非要两个不同呢?老师,能讲一下区别么

    作者回复: 如果都用同一个互斥量的话,操作双方就无法独立行事,这就是完全串行的操作了,效率上会大打折扣。

    进一步说,本来就是一个发一个收,理应一个用写锁一个用读锁,这样效率高,之后扩展起来也方便。因为读之间不用互斥。

    
     2
  • ming
    2018-12-17
    多routine从信箱中获取情报, 都在等mailbox变量的值不为0的时候再把它的值变为0,
    这个 RLock 限制不了写操作,可能会有多个routine同时将 mailbox 变为0的,跟文中的场景有些不合。
    不知道我理解的有没有问题
     2
     2
  • 疯琴
    2019-12-10
    秘密接头的类比形象生动,学习过程轻松有趣又不失深度。
    
     1
  • 🤔
    2019-04-09
    需传递 *sync.Cond

    因为 Cond 结构体中的 notify 变量和 checker 变量都是值类型,传递sync.Cond 会复制值,这样两个锁保留的被阻塞的 Goroutine 就不同了。
    
     1
  • beiliu
    2018-12-31
    您好,老师,官方文档是建议,singal在锁住的情况下使用的“Signal唤醒等待c的一个线程(如果存在)。调用者在调用本方法时,建议(但并非必须)保持c.L的锁定“
    
     1
  • 骏Jero
    2018-10-12
    为什么这里使用for mailbox == 1 { }, 看wait内部实现,等待是wait中runtime_notifyListWait(&c.notify, t)起到的作用,感觉用if一样达到效果
    
     1
  • 思维
    2020-01-17
    “如果信箱里没有情报,那么我就把新情报放进去,关上信箱、锁上锁,然后离开。用代码表达出来就是mailbox = 1和lock.Unlock()。” 文中这句,锁上锁 对应的是lock.Unlock() 费解!!
    
    
  • lfn
    2020-01-16
    打卡,2020-01-16.
    
    
  • Howard
    2019-12-16
    我能把mailbox = 0放到lock.RUnlock()外面吗?总觉得读锁里面改动mailbox有点不好。

    作者回复: 不可以,共享资源总是需要受到保护。

     1
    
  • qiushye
    2019-08-22
    文章的例子是“我发信,你收信”,示例图表达的是“你发信,我收信”,稍有不足.

    作者回复: 你说的是 recvCond?这可不是收信的意思啊。

     1
    
  • bluuus
    2019-08-14
    我试了一下demo61.go, 发现永远只有一个协程可以进到wait方法,当mailbox初始值是0,只有可能收协程进到wait方法;当mailbox初始值为1,只有可能发协程进到wait方法。为什么会这样

    作者回复: 你对 demo61.go 有改动吗?

     1
    
  • 党
    2019-07-29
    demo60太经典了 不仅体会到了锁的用法 还体会到了 如何利用chan 阻塞主线程 以使goroutine完全跑完 算是chan经典用法吧
    
    
  • ...
    2019-02-20
    老师 wait会释放锁吗

    作者回复: 每次执行结束前都会释放,要不其他goroutine没法进入锁保护的临界区。

     1
    
  • 打你
    2018-11-10
    我肯定需要先调用lock变量的Lock方法。注意,这个Loc...

    极客时间版权所有: https://time.geekbang.org/column/article/41588

    这一段写得太拗口啦。什么叫持有锁,而不锁上锁。后面然后又unlock,费解。
    在我看来,这不是读写锁中的写锁么,相当于获取了写锁
    展开
    
    
  • 云学
    2018-10-18
    本文的例子如果只用一个条件变量,不用2个,是不是也可以呢?
    
    
  • 卒迹
    2018-10-16
                if mailbox ==0 {
                    recvCond.Wait()
                }
    为什么发送goroutine和发送goroutine用if 替换for打印的结果和用for结构一样的
    
    
我们在线,来聊聊吧