在go语言中实现原子操作示例代码
Go  /  管理员 发布于 10个月前   213
在go语言中实现原子操作非常便捷直接调用sync/atomic包即可。
1.先来看一个错误的示例
通过启动 1000 个 goroutine 来模拟并发调用,在函数内部对变量 number 进行自增操作,
那么可能存在的一个问题是,当多个 goroutine 同时对变量操作时,
只有一个成功了,其他的全部失败,
造成的后果就是变量 最终的值小于 1000 (正常情况应该是等于 1000)。
package main
import (
"fmt"
"sync"
)
func main() {
var number uint32
var wg sync.WaitGroup
for i := 0; i < 1000; i++ {
wg.Add(1)
go func() {
defer func() {
wg.Done()
}()
number++
}()
}
wg.Wait()
fmt.Printf("number = %d\n", number)
}
// $ go run main.go
// 输出如下,你的输出可能和这里的不一样,多试几次,会发现每次的结果都不一样
/**
number = 971
*/
2.正确的并发操作
package main
import (
"fmt"
"sync"
"sync/atomic"
)
func main() {
var number uint32
var wg sync.WaitGroup
for i := 0; i < 1000; i++ {
wg.Add(1)
go func() {
defer func() {
wg.Done()
}()
//number++
atomic.AddUint32(&number, 1) // 使用原子操作
}()
}
wg.Wait()
fmt.Printf("number = %d\n", number)
}
// $ go run main.go
// 输出如下,多试几次,会发现结果都是一样的
/**
number = 1000
*/
123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..路人 在
php中使用hyperf框架调用讯飞星火大模型实现国内版chatgpt功能示例中评论 教程很详细,如果加个前端chatgpt对话页面就完美了..Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号