搜索
您的当前位置:首页正文

go sync.Cond的使用

来源:爱go旅游网

简介

首先看下源码注释

代码示例

var sharedRsc = false
func tCond1() {
	var wg sync.WaitGroup
	wg.Add(2)
	m := sync.Mutex{}
	c := sync.NewCond(&m)

	go func() {
		c.L.Lock()
		for sharedRsc == false {
			fmt.Println("goroutine1 wait")
			c.Wait()
		}
		//c.Wait()
		fmt.Println("goroutine1 ", sharedRsc)
		c.L.Unlock()
		wg.Done()
	}()

	go func() {
		c.L.Lock()
		for sharedRsc == false {
			fmt.Println("goroutine2 wait")
			c.Wait()
		}
		fmt.Println("goroutine2", sharedRsc)
		c.L.Unlock()
		wg.Done()
	}()

	// 主动延时
	time.Sleep(2 * time.Second)
	c.L.Lock()
	fmt.Println("改变共享资源状态")
	sharedRsc = true
	c.Broadcast()
	fmt.Println("我改好了,你们自己看着办吧")
	c.L.Unlock()
	wg.Wait()
}

总结

sync.Cond 的作用不是保证在同一时刻,仅有一个进程可以访问某个共享资源(mutex),而是在对应的共享资源的状态发生变化时,通知其他因此而阻塞的线程

因篇幅问题不能全部显示,请点此查看更多更全内容

Top