• Go入门笔记-19 CAS使用


    1、EdgeX中有类似的代码

     这是一个CAS操作,不过比较复杂的

    2、以下内容来自https://zhuanlan.zhihu.com/p/56733484

    package main
    
    import (
    	"fmt"
    	"sync"
    	"sync/atomic"
    )
    
    var (
    	counter int32          //计数器
    	wg      sync.WaitGroup //信号量
    )
    
    func main() {
    
    	threadNum := 5
    
    	//1. 五个信号量
    	wg.Add(threadNum)
    
    	//2.开启5个线程
    	for i := 0; i < threadNum; i++ {
    		go incCounter(i)
    	}
    
    	//3.等待子线程结束
    	wg.Wait()
    	fmt.Println(counter)
    }
    
    func incCounter(index int) {
    	defer wg.Done()
    
    	spinNum := 0
    	for {
    		//2.1原子操作
    		old := counter
    		ok := atomic.CompareAndSwapInt32(&counter, old, old+1)
    		if ok {
    			break
    		} else {
    			spinNum++
    		}
    	}
    
    	fmt.Printf("thread,%d,spinnum,%d
    ", index, spinNum)
    
    }
    

    3、执行结果

      

    本博客是个人工作中记录,遇到问题可以互相探讨,没有遇到的问题可能没有时间去特意研究,勿扰。
    另外建了几个QQ技术群:
    2、全栈技术群:616945527,加群口令abc123
    2、硬件嵌入式开发: 75764412
    3、Go语言交流群:9924600

    闲置域名www.nsxz.com出售(等宽等高字符四字域名)。
  • 相关阅读:
    emberjs初学记要
    自我的一点介绍(七夕礼物)
    JavaScript数据类型
    Vue+Webpack项目配置
    Git知识点整合
    Log4j简单配置解析
    如何明智地向程序员提问
    Navicat连接mysql报错1251
    多表查询sql语句
    PLSQL面向对象
  • 原文地址:https://www.cnblogs.com/zhaogaojian/p/15138262.html
Copyright © 2020-2023  润新知