gpt4 book ai didi

go - 理解 Go 的内存模型

转载 作者:数据小太阳 更新时间:2023-10-29 03:03:22 26 4
gpt4 key购买 nike

<分区>

避免锁定并发 C 代码的一个看似聪明的技巧是这样的:我有一个全局变量 ptr 指向一个 mystruct 我想更新那个结构.因此,我将分配一个新的 mystruct,将数据填充到 中,然后才 我将通过指向 ptr 使更改对世界可见到新的 mystruct 对象。

这是不正确的,因为它取决于写入的顺序,并且不能保证对 ptr 的写入在所有存储到新的 mystruct 之后对其他线程可见已经发生。因此,新的 mystruct 对象可以部分初始化返回。

我的问题是:这也可以发生在 Go 中吗?我认为可以,但我不得不说我找到了The Go Memory Model有点看不懂。

我写了一些 Go 代码来测试它,但是在我的机器上,不良行为并没有表现出来:

package main

import (
"fmt"
"time"
)

type mystruct struct {
a int
b int
}

var (
ptr *mystruct
counter int
)

func writer() {
for {
counter += 1
s := mystruct{a: counter, b: counter}
ptr = &s
}
}

func reader() {
time.Sleep(time.Millisecond)
for {
if ptr.a != ptr.b {
fmt.Println("Oh no, I'm so buggy!")
}
}
}

func main() {
go writer()
go reader()
select {}
}

这当然证明不了什么。

您能否简要比较 Go 的 goroutine 提供的内存保证与 C 中的 POSIX 线程提供的(几乎没有保证)?

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