Go语言协程并发---条件变量

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(time.Second)

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

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

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

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

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

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

  

posted @ 2020-04-25 21:38  Ethan_Cheng  阅读(235)  评论(0编辑  收藏  举报