zoukankan      html  css  js  c++  java
  • 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()
    	}
    }
    

      

  • 相关阅读:
    maven错误
    angularjs的一点总结
    工具汇总
    重启outlook的bat脚本
    前端框架参考
    imply套件以及plyql的安装
    centos下nodejs,npm的安装和nodejs的升级
    kafka错误集锦
    动态规划DP笔记
    链接
  • 原文地址:https://www.cnblogs.com/yunweiqiang/p/12775432.html
Copyright © 2011-2022 走看看