gpt4 book ai didi

go - 在 golang 中初始化 RWMutex 崩溃?

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

以下代码因以下错误而崩溃,为什么??

package main

import (
"sync"

)

var foo *sync.RWMutex

func main() {
foo.Lock()
}

输出:

panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0xffffffff addr=0x0 pc=0x8125c]

goroutine 1 [running]:
sync.(*RWMutex).Lock(0x0, 0x104000f0)
/usr/local/go/src/sync/rwmutex.go:86 +0x1c
main.main()
/tmp/sandbox093456788/main.go:11 +0x20

Program exited.

当您使用以下行之一时,它不会发生

var foo = new(sync.RWMutex)
var foo sync.RWMutex

用于 foo 变量的初始化。

最佳答案

互斥量通常设计为无需任何类型的初始化即可工作。也就是说,使用它们只需要一个零值互斥锁。要修复您的程序,请将 foo 声明为一个值。不是指向互斥量的指针:

var foo sync.RWMutex

func main() {
foo.Lock()
}

当您将 foo 声明为指针时:

var foo *sync.RWMutex

foo 是一个零值指针(用于键入 sync.RWMutex),即它不指向有效的互斥锁值。 foonil。这就是为什么在调用方法时会出现 nil 指针异常的原因。

但是,请注意,要在 goroutines/functions 之间共享互斥锁,您必须在它们初始化后(如上)将它们作为指针传递,否则它们将不会被共享。

来自文档:

An RWMutex must not be copied after first use.

文档:https://golang.org/pkg/sync/#RWMutex

关于go - 在 golang 中初始化 RWMutex 崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44215799/

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