首页 > 其他分享 >go channel ->同步

go channel ->同步

时间:2024-05-11 23:41:09浏览次数:16  
标签:wg 同步 读写 cond 竟态 go data channel

通道并非用来取代锁,各有不同使用场景。
通道解决高级别逻辑层次并发架构,锁则用来保护低级别局部代码安全。

●竟态条件:多线程同时读写共享资源(竟态资源)。
●临界区:读写竟态资源的代码片段。

●互斥锁:同一时刻,只有一个线程能进入临界区。
●读写锁:写独占(其他读写均被阻塞),读共享。
●信号量:允许指定数量线程进入临界区。
●自旋锁:失败后,以循环积极尝试。(无上下文切换,小粒度)

●悲观锁:操作前独占锁定。
●乐观锁:假定无竞争,后置检查。(Lock Free, CAS)

标准库 sync 提供了多种锁,另有原子操作等。

●Mutex:互斥锁。
●RWMutex:读写锁。

●WaitGroup:等待一组任务结束。
●Cond:单播或广播唤醒其他任务。
●Once:确保只调用一次(函数)。

●Map:并发安全字典,(少写多读,数据不重叠)
●Pool:对象池。(缓存对象可被回收)

竞争检测

测试阶段,以 -race 编译,注入竞争检查(data race detection)指令。

●有较大性能损失,避免在基准测试和发布版本中使用。
●有不确定性,不能保证百分百测出。
●单元测试有效完整,定期执行竞争检查。

条件变量

内部以计数器和队列作为单播(signal)和广播(broadcast)依据。
引入外部锁作为竟态资源保护,可与其他逻辑同步。

func main() {
	var wg sync.WaitGroup

	cond := sync.NewCond(&sync.Mutex{})
	data := make([]int, 0)

	// 1 写
	wg.Add(1)
	go func() {
		defer wg.Done()

		for i := 0; i < 5; i++ {
            
            // 保护竟态资源。
			cond.L.Lock()
			data = append(data, i + 100)
			cond.L.Unlock()
            
            // 唤醒一个。
			cond.Signal()
		}

        // 唤醒所有(剩余)。
		// cond.Broadcast()
	}()

	// n 读
	for i := 0; i < 5; i++ {
		wg.Add(1)

		go func(id int) {
			defer wg.Done()
            
            // 锁定竟态资源。
			cond.L.Lock()

            // 循环检查是否符合后续操作条件。
            // 如条件不符,则继续等待。
			for len(data) == 0 {
				cond.Wait()
			}

			x := data[0]
			data = data[1:]

			cond.L.Unlock()
			println(id, ":", x)
		}(i)
	}

	wg.Wait()
}

 

 

 

   

标签:wg,同步,读写,cond,竟态,go,data,channel
From: https://www.cnblogs.com/codestack/p/18187378

相关文章

  • golang channel 封装
    对于closed或nil通道,规则如下:无论收发,nil通道都会阻塞。不能关闭nil通道。重复关闭通道,引发panic!向已关闭通道发送数据,引发panic!从已关闭通道接收数据,返回缓冲数据或零值。nil通道是指没有make的变量。鉴于通道关闭后,所有基于此的阻塞都被解除,可用作通知。没......
  • hmall | 引入ES实现高效搜索与同步双写
    在gitee、飞书、百度云、B站中,黑马都没有上传该部分资料,以下皆为个人观点,如有纰漏欢迎指正 1.先把item-service中的searchcontroller抽出来,抽到一个模块中并将其设为hmall的子模块2.引入依赖common,nacos,bootstrap,es<!--web--><dependency><gr......
  • luogu P4342[IOI1998]Polygon
    阅读前需深剖析分系列是记录我个人的做题思路,实现过程的全面分析,存在内容可靠、思路健全、分析到位、试错纠错等优于一般题解的特征,其中,Quest部分表示探索问题,我会在此提出做题时的想法、问题,并在内容中得到解决,因此建议从上到下按序浏览,以防出现思路断层,内容不衔接的情况,感谢理......
  • Beego-Orm-关联查询
    packagemodelsimport"github.com/beego/beego/v2/client/orm"typeCustomerstruct{Idint`orm:"pk;auto""`UserNamestringSexstring`orm:"size(5)"`Mobilestring`orm:"size(11)"`Ord......
  • Django性能之道:缓存应用与优化实战
    title:Django性能之道:缓存应用与优化实战date:2024/5/1118:34:22updated:2024/5/1118:34:22categories:后端开发tags:缓存系统Redis优点Memcached优缺点Django缓存数据库优化性能监控安全实践引言在当今的互联网时代,用户对网站和应用程序的性能要求越来......
  • django 点击按钮,显示文本,js实现
    方法一:点击显示弹出框<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>数据弹窗</title><scripttype="text/javascript">functionshowAlert(data){......
  • mongodb keysExamined ,mongodb nreturned
    keysExamined是MongoDB查询执行阶段的一个指标,用于表示在索引扫描过程中检查的界内和界外键的总数。这个值可以帮助我们了解查询是否有效地利用了索引。如果keysExamined的值大于0,这意味着查询正在使用索引。如果keysExamined的值非常高,但返回的文档数量(nreturned)却很低,这可能表明......
  • mongodb 收集统计信息
    在MongoDB中,收集统计信息主要可以通过以下几种方法实现:使用db.collection.stats()命令:这个命令可以返回指定集合的详细统计信息,包括文档数量、索引数量和大小等。此外,还可以通过设置indexDetails:true参数来获取与每个索引相关的详细信息。使用index_stats()函数:这个函数专......
  • 电力GPS北斗卫星同步时钟(时间同步装置)组成及配置方法
    电力GPS北斗卫星同步时钟(时间同步装置)组成及配置方法电力GPS北斗卫星同步时钟(时间同步装置)组成及配置方法京准电子科技官微——ahjzsz随着计算机和网络通信技术的飞速发展,火电厂热工自动化系统数字化、网络化的时代已经到来。一方面它为控制和信息系统之间的数据交换、分析......
  • TheAlgorithms/C - 各种基础算法、数据结构的 C 语言实现+armink/SFUD - 一款基于 JED
    1、OpenMV-RT-基于恩智浦i.MXRT系列的开源机器视觉AI模块OpenMV-RT是一款基于恩智浦最近主打的i.MXRT超高性能系列MCU的视觉模块,模块设计者是恩智浦大牛工程师宋岩(对,就是ARMCortex-M3权威指南中文版作者)。模块源代码: https://github.com/RockySong/micropython......