关于Sync.Mutex的竞争问题

Chaoxin · · 1214 次点击
``` var s1, s2 = make(chan int, 1), make(chan int, 1) var wg sync.WaitGroup = sync.WaitGroup{} func produce(ch chan<- int) { for i := 0; i < 10; i++ { <-s1 ch <- i fmt.Println("produce:" + strconv.Itoa(i)) s2 <- 1 } close(s2) wg.Done() } func consumer(ch <-chan int) { for i := 0; i < 10; i++ { <-s2 v := <-ch fmt.Println("consumer:" + strconv.Itoa(v)) s1 <- 1 } close(s1) wg.Done() } func main() { ch := make(chan int, 1) wg.Add(2) s1 <- 1 go consumer(ch) go produce(ch) wg.Wait() } ```
#12
更多评论
个人理解不一定正确: produce在执行第五次的时候,ch已经执行mu.Lock(),此时ch已满,通道阻塞,但是mu.Unlocl没有释放锁,所以造成了持续阻塞。
#1
谢谢解答。不过我的疑惑是produce在通道未满的时候,也有释放锁。但是consumer永远竞争不到,produce一直占有
#2