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

Posted yunweiqiang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Go语言协程并发---条件变量案例《城管来啦》相关的知识,希望对你有一定的参考价值。

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语言协程并发---条件变量案例《城管来啦》的主要内容,如果未能解决你的问题,请参考以下文章

2021-GO语言并发编程

2021-GO语言并发编程

Go笔记(十五):并发编程

go语言并发编程

Golang协程并发的流水线模型

go语言学习笔记 — 进阶 — 并发编程:go语言的协程goroutine,与普通程序的协程coroutine