当前位置: 首页 > article >正文

golangb并发,Sync包中Mutes,WaitGroup, NewCond的适应

几个demo来学习和演示sync包的使用。

package lockdemo

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

var sum int = 0
var lock sync.Mutex
var rwlock sync.RWMutex
var wg sync.WaitGroup

func add(i int) {
	lock.Lock()
	defer lock.Unlock()
	sum += i
}

func readSum() int {

	//只获取读锁
	rwlock.RLock()
	defer rwlock.RUnlock()
	b := sum

	return b

}

func run() {

	//因为要监控110个协程,所以设置计数器为110
	wg.Add(110)
	for i := 0; i < 100; i++ {
		go func() {
			//计数器值减1
			defer wg.Done()
			add(10)
		}()
	}

	for i := 0; i < 10; i++ {
		go func() {
			//计数器值减1
			defer wg.Done()
			fmt.Println("和为:", readSum())
		}()
	}

	//一直等待,只要计数器值为0
	wg.Wait()
}

// 只执行一次
// 适用于创建某个对象的单例、只加载一次的资源等只执行一次的场景
func doOnce() {
	var once sync.Once
	onceBody := func() {
		fmt.Println("Only once")
	}

	//用于等待协程执行完毕
	done := make(chan bool)

	//启动10个协程执行once.Do(onceBody)
	for i := 0; i < 10; i++ {
		go func() {
			//把要执行的函数(方法)作为参数传给once.Do方法即可
			once.Do(onceBody)
			done <- true
		}()
	}

	for i := 0; i < 10; i++ {
		<-done
	}
}

// 10个人赛跑,1个裁判发号施令
// 适用于需要等待多个协程完成某个任务的场景
func race() {

	cond := sync.NewCond(&sync.Mutex{})
	var wg sync.WaitGroup
	wg.Add(11)

	for i := 0; i < 10; i++ {
		go func(num int) {
			defer wg.Done()
			fmt.Println(num, "号已经就位")
			cond.L.Lock()
			cond.Wait() //等待发令枪响
			fmt.Println(num, "号开始跑……")
			cond.L.Unlock()
		}(i)
	}

	//等待所有goroutine都进入wait状态
	time.Sleep(2 * time.Second)

	go func() {
		defer wg.Done()
		fmt.Println("裁判已经就位,准备发令枪")
		fmt.Println("比赛开始,大家准备跑")
		cond.Broadcast() //发令枪响,唤起所有的协程、Signal,唤醒一个等待时间最长的协程。
	}()
	//防止函数提前返回退出
	wg.Wait()
}


http://www.kler.cn/a/457374.html

相关文章:

  • 解决uniapp H5页面限制输入框只能输数字问题
  • SpringCloudAlibaba实战入门之路由网关Gateway过滤器(十三)
  • 2024年度总结答疑
  • 建立一个Macos载入image的实例含界面
  • kafka怎么保证顺序消费?
  • xadmin后台首页增加一个导入数据按钮
  • 八大排序——直接插入排序
  • 几款性能优秀的差分进化算法DE(SaDE、JADE,SHADE,LSHADE、LSHADE_SPACMA、LSHADE_EpSin)-附Matlab免费代码
  • CAN201 Introduction to Networking(计算机网络)Pt.2 传输层
  • 行为树详解(5)——事件驱动
  • 跨域请求问题
  • 一种基于动态部分重构的FPGA自修复控制器
  • 美国站群服务器如何帮助实现有效的多域名管理?
  • 【深入理解SpringCloud微服务】Sentinel源码解析——FlowSlot流控规则
  • 从2024 re:Invent,看亚马逊云科技的AI布局
  • 【机器学习】分类
  • Element-plus自动导入
  • Crawler实现英语单词的翻译
  • linux内核如何实现TCP的?
  • 【Bug记录】黑马点评使用jmeter进行秒杀抢购时报401以及200后HTTP请求依旧异常的解决办法
  • Cpp::AVL树的机制详解与实现(23)
  • 产品原型设计
  • IntelliJ IDEA 远程调试
  • 在Ubuntu下通过Docker部署Misskey服务器
  • MATLAB语言的数据库编程
  • 基于STM32F103控制L298N驱动两相四线步进电机