package main
import (
"fmt"
"runtime"
"sync/atomic"
"time"
)
func main() {
//定义一个整数
var ops uint64 = 0
//使用50个协程给ops累加数值
for i := 0; i < 50; i++ {
go func() {
//这里是循环多少次未知
for {
atomic.AddUint64(&ops, 1)
//这个函数用于时间片切换,可以理解为高级版的time.Sleep(),避免前面的for循环将CPU时间片都卡在一个线程里,使得其它线程没有执行机会
//runtime.Gosched()表示让CPU把时间片让给别人,下次某个时候继续恢复执行该goroutine,自己一般是阻塞了,这是一个很高级的sleep,我们经常会遇到要sleep多久的问题,这里不用考虑了,别人完成后,自然会通知你。
runtime.Gosched()
}
}()
}
//停一秒,上面50个线程有1秒的执行时间
time.Sleep(time.Second)
// 获取结果
opsFinal := atomic.LoadUint64(&ops)
fmt.Println("ops:", opsFinal)
//
var tmpOps int64 = 0
t1 := time.Now().UnixNano()
//执行n个线程执行原子操作
for tmpOps < 10000000 {
go func() {
atomic.AddInt64(&tmpOps, 1)
}()
}
t2 := time.Now().UnixNano()
t := t2 - t1
fmt.Println(t)
fmt.Println(tmpOps)
}