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、执行结果