码迷,mamicode.com
首页 > 编程语言 > 详细

Go语言协程并发---条件变量案例《城管来啦》

时间:2020-04-26 01:52:33      阅读:87      评论:0      收藏:0      [点我收藏+]

标签:adc   sleep   条件变量   sele   集群   for   pack   条件   div   

package main

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

/*
城管预警
·监听城管大队
·烧烤摊集群:监听城管大队,只要出动就发消息通知工会主席并进入阻塞等待至被唤醒,否则就提供露天烧烤
·公关专员:摆平城管大队,并广播通知所有烧烤摊主
*/

func main() {
	var dangerous = false
	cond := sync.NewCond(&sync.Mutex{})
	chDanger := make(chan string, 1)

	for i := 1; i <= 3; i++ {
		go func(index int) {
			for true {
				//只要城管出来,就等待起来
				cond.L.Lock()
				for dangerous==true{
					//发送预警
					select {
					case chDanger <- "城管来了!!":
						fmt.Println("城管来了!")
						fmt.Println(index,":蛰伏状态")
					default:
						//已经有人发过了
					}

					cond.Wait()
				}
				cond.L.Unlock()


				//城管没出来
				fmt.Println(index,":提供露天烧烤")
				time.Sleep(3*time.Second)
			}

		}(i)
	}

	go func() {
		for true {
			select {
			case <-chDanger:
				//帮大家平事儿
				cond.L.Lock()
				time.Sleep(3*time.Second)
				dangerous=false
				fmt.Println("事情已经摆平")
				cond.Broadcast()
				cond.L.Unlock()
			default:
				//日常生活
				fmt.Println("工会主席的日常幸福生活")
				dangerous=true
				time.Sleep(3*time.Second)
			}
		}
	}()

	time.Sleep(365*time.Second)
}

  

Go语言协程并发---条件变量案例《城管来啦》

标签:adc   sleep   条件变量   sele   集群   for   pack   条件   div   

原文地址:https://www.cnblogs.com/yunweiqiang/p/12776505.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!