package main

import (
	"fmt"
	"runtime"
	"sync"
)

func main() {
	var num int
	mu := new(sync.RWMutex)
	cond := sync.NewCond(mu.RLocker())
	var wg sync.WaitGroup
	wg.Add(2)
	f1 := func() {
		mu.RLock()
		fmt.Println("f1 waiting")
		cond.Wait()
		fmt.Println("f1:", num)
		mu.RUnlock()
		wg.Done()
	}
	f2 := func() {
		mu.Lock()
		num = num + 1
		mu.Unlock()
		cond.Signal()
		fmt.Println("f2 signal")
		wg.Done()
	}
	go f1()
	runtime.Gosched()
	go f2()
	wg.Wait()
	fmt.Println("end")
}

posted on 2018-01-10 22:21  angry-baby  阅读(925)  评论(0)  编辑  收藏  举报