【发布时间】:2018-11-05 16:01:58
【问题描述】:
我希望这两个 goroutine 永远阻塞,原因如下,但事实并非如此。为什么?
通道没有缓冲区,将等待
receive()接收。send()持有锁,所以receive()中的num := <-s.ch没有机会执行。永久阻止
怎么了?
package main
import (
"sync"
"fmt"
)
type S struct {
mu sync.Mutex
ch chan int
wg sync.WaitGroup
}
func (s *S) send() {
s.mu.Lock()
s.ch <- 5
s.mu.Unlock()
s.wg.Done()
}
func (s *S) receive() {
num := <-s.ch
fmt.Printf("%d\n", num)
s.wg.Done()
}
func main() {
s := new(S)
s.ch = make(chan int)
s.wg.Add(2)
go s.send()
go s.receive()
s.wg.Wait()
}
【问题讨论】:
标签: go mutex channel goroutine