zoukankan      html  css  js  c++  java
  • 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出售(等宽等高字符四字域名)。
  • 相关阅读:
    人月神话阅读笔记
    12周总结
    IOS成长之路-用NSXMLParser实现XML解析
    沟通能力的表达
    IOS中UIScrollView的contentSize、contentOffset和contentInset属性
    Block 的使用时机
    drawAdapter
    drawpoly()函数的用法
    @synchronized(self)
    Swift2
  • 原文地址:https://www.cnblogs.com/zhaogaojian/p/15138262.html
Copyright © 2011-2022 走看看