gpt4 book ai didi

go - go++ 运算符需要互斥量吗?

转载 作者:IT王子 更新时间:2023-10-29 02:35:44 26 4
gpt4 key购买 nike

go++ Operator需要mutex吗?似乎当不使用互斥锁时,我丢失了一些数据,但根据逻辑++ 只需将 +1 值添加到当前值,所以即使顺序不正确,仍然应该总共运行 1000 次,不是吗?示例:

package main

import (
"fmt"
"sync"
)

func main() {
var wg sync.WaitGroup
i := 0
for r := 0; r < 1000; r++ {
wg.Add(1)
go func() {
i++
fmt.Println(i)
wg.Done()
}()
}
wg.Wait()
fmt.Printf("%d Done", i)
}

最佳答案

要“将当前值加 1”,计算机需要读取当前值,加 1,然后新值。显然,顺序很重要;标准示例是:

Thread A     Thread B
Read: 5
Read: 5
+1 = 6
+1 = 6
Write: 6
Write: 6

值从5开始,两个执行线程各加1,结果为6(应该是7),因为B的读发生在A的写之前。

但是这里有一个更重要的误解:许多人认为在比赛的情况下,代码要么读取旧值,要么读取新值。 不能保证。这可能是大多数时候发生的事情。这可能是在您的计算机上一直发生的事情,使用当前版本的编译器等。但是actually it's possible对于以不安全/不友好的方式访问数据以产生任何结果,甚至完全是垃圾的代码。如果您引发竞争,则不能保证您从变量中读取的值与它曾经拥有的任何值相对应。

关于go - go++ 运算符需要互斥量吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54417609/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com