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) }
阅完此文,您的感想如何?
-
有用
0
-
没用
0
-
开心
0
-
愤怒
0
-
可怜
0
1.如文章侵犯了您的版权,请发邮件通知本站,该文章将在24小时内删除;
2.本站标注原创的文章,转发时烦请注明来源;
3.Q群: 2702237 13835667
相关课文
-
GO语言GORM如何更新字段
-
gorm如何创建记录与模型定义需要注意什么
-
gorm一般查询与高级查询
-
GORM时间戳跟踪及CURD(增删改查)
我要说说
网上嘉宾点评
课文推荐