原 4.5-2 并发技术7:条件变量

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010986776/article/details/86308316

概述

  • sync包下的Cond对象能够帮我们实现并发中对任意对象的值的监听
  • 当不满足条件时,我们进行阻塞等待
  • 而当条件满足时,我们又能以通知的形式通知等待协程
  • 这有点类似并发中的观察者模式

案例说明

  • 在下面的例子中,投资者监听比特币的市场行情
  • 当行情下跌时,投资者协程阻塞等待等待上涨通知,行情上涨时进行投资
  • 市场协程在比特币上涨时通知投资者协程
package main

import (
	"fmt"
	"sync"
	"time"
)

func main() {
	//要监听的变量
	bitcoinRising := false

	//创建条件变量
	cond := sync.NewCond(&sync.Mutex{})

	/*市场协程*/
	go func() {
		for {

			/*加锁修改为涨,并通知投资者*/
			cond.L.Lock()
			bitcoinRising = true
			cond.Broadcast()
			cond.L.Unlock()

			//持续涨
			time.Sleep(1 * time.Second)

			/*加锁修改为跌*/
			cond.L.Lock()
			bitcoinRising = false
			cond.L.Unlock()

			//持续一段时间
			time.Sleep(3 * time.Second)
		}
	}()

	/*投资者协程*/
	for {
		/*
		加锁阅读比特币的变化
		只要比特币跌,就停止投资,等待涨的消息(释放锁)
		*/
		cond.L.Lock()
		for bitcoinRising==false {
			fmt.Println("停止比特币投资")

			/*
			阻塞等待消息
			收到涨的消息,就继续向下执行(其它协程通过cond.Signal/Broadcast()发送涨跌消息)
			*/
			cond.Wait()//内部将锁释放

			//收到了市场变化的消息后继续执行
		}

		//走到这里说明bitcoinRising=true
		fmt.Println("开始投资比特币...")
		cond.L.Unlock()
	}

}

猜你喜欢

转载自blog.csdn.net/u010986776/article/details/86308316