初始化RWMutex在golang崩溃?

时间:2017-05-27 10:36:00

标签: go

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

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变量。

1 个答案:

答案 0 :(得分:2)

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

var foo sync.RWMutex

func main() {
    foo.Lock()
}

当您将foo声明为指针时:

var foo *sync.RWMutex

foo是零值指针(类型为sync.RWMutex,即它不指向有效的互斥锁值。 foonil。这就是调用方法时nil指针异常的原因。

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

来自文档:

  

首次使用后,不得复制RWMutex。

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