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(增删改查)
我要说说
网上嘉宾点评
课文推荐