我在Go中写了一些线程安全的东西。我尝试使用互斥锁。
我发现here的示例似乎没有进行任何初始化就使用了互斥锁:
...
// essential part of the referred page
// (it is not my code, I know the pointer is unneeded here,
// it is the code of the referred site in the link - @peterh)
var mutex = &sync.Mutex{}
var readOps uint64 = 0
var writeOps uint64 = 0
for r := 0; r < 100; r++ {
go func() {
total := 0
for {
key := rand.Intn(5)
mutex.Lock()
....
我有点意外。这是真的吗,他们不需要任何初始化?
答案 0 :(得分:9)
互斥锁不需要初始化。
也可能只是var mutex sync.Mutex,不需要指针,对于int值也是如此,不需要将它们设置为0,因此您找到的示例可以得到改进。在所有这些情况下,零值都很好。
看到这一点有效go:
https://golang.org/doc/effective_go.html#data
由于new返回的内存归零,因此安排很有帮助 在设计数据结构时,每种类型的零值 无需进一步初始化即可使用。这意味着用户 数据结构可以创建一个新的和正确的工作。对于 例如,bytes.Buffer的文档声明“零 Buffer的值是一个可以使用的空缓冲区。“同样, sync.Mutex没有显式构造函数或Init方法。 相反,sync.Mutex的零值被定义为未锁定 互斥。