• 木头发芽
    2020-12-14
    semaphore是用Mutex和Channel通知实现的,而Mutex又依赖于go内部的信号量实现,那这个内部的信号量又是用什么实现的?

    作者回复: atomic和gopark,参考runtime/sema.go

    
    5
  • 刚子
    2020-11-16
    不是很理解这句话 :"一次请求多个资源,这是通过 Channel 实现的信号量所不具备的。" Channel 也可以开启多个goroutine 去请求多个资源

    作者回复: 意思是通过一次调用,只能从chan中获取一个值,多个。goroutine需要调用多次才能得到n个值

    
    2
  • 白开d水
    2023-03-23 来自北京
    打卡

    作者回复: 👍🏻

    
    
  • Geek_a6104e
    2022-07-31 来自北京
    return &semaphore{ch: make(chan struct{}, capacity)} 请问一下最后一个例子semaphore结构初始化为啥会多个capacity

    作者回复: 等于你的资源数。预先确定好

    
    
  • 8.13.3.27.30
    2022-01-06
    打卡完成

    作者回复: 👍🏻👍🏻👍🏻

    
    
  • 伟伟
    2020-11-23
    type Semaphore chan struct{} func NewSemaphore(cap int) Semaphore { return make(chan struct{}, cap) } func (s Semaphore) Acquire(n int) { for i := 0; i < n; i++ { s <- struct{}{} } } func (s Semaphore) Release(n int) { for i := 0; i < n; i++ { <-s } } func NewSemaphore2(cap int) Semaphore { sem := make(chan struct{}, cap) for i := 0; i < cap; i++ { sem <- struct{}{} } return sem } func (s Semaphore) Acquire2(n int) { for i := 0; i < n; i++ { <-s } } func (s Semaphore) Release2(n int) { for i := 0; i < n; i++ { s <- struct{}{} } }

    作者回复: 唯一存在的问题是可能出现死锁。 比如信号量是10,同时有两个goroutine请求8个资源。

    共 5 条评论
    
  • 虫子樱桃
    2020-11-19
    老师的例子里面,是通过 计算机的协程 runtime.GOMAXPROCS(0) 来模拟有限的资源(比喻例子里面的书),那么这个semaphore的场景是不是就是比较适用于请求有流量或者调用次数限制的场景呢?

    作者回复: 这个更多是用ratelimiter,信号量主要并发访问n个资源的场景

    
    
  • Ethan Liu
    2020-11-17
    老师,Acquire函数为什么还会有第二个select语句?这部分逻辑是什么啊?

    作者回复: 理解了ctx,也就理解select。当外部context通知取消请求时,会在检查一下当前是否请求成功了

    共 3 条评论
    
  • thomas
    2021-01-01
    补充说明下 信号量 p/v的含义: P—— passeren,中文译为"通过",V—— vrijgeven,中文译为"释放" (因为作者是荷兰人,上面单词为荷兰语)
    共 1 条评论
    20
  • myrfy
    2020-11-16
    第一个问题: 至少两种,写入ch算获取,自己读取ch算获取 第二个问题应该是防止错误获取或者释放信号量时,出现负数溢出到无穷大的问题。如果溢出到无穷大,就会让信号量失效,从而导致1被保护资源更大规模的破坏
    共 1 条评论
    7