在不同结构中声明多个* sync.Mutex变量

问题描述 投票:0回答:1

为了使我的程序更高效,我可以将* sync.Mutex变量与结构相关联,以便当我执行a.Mutex.Lock()时,它仅锁定游戏服务器上的goroutines操作吗?

如果我将* sync.Mutex变量声明为全局变量,然后从每个单个变量中调用它,则

或者它不会改变任何内容(因为每当我在any互斥锁上设置锁定时,所有变量都被锁定了吗?)游戏服务器?例如:

package main

import (
    "fmt"
    "sync"
)

type gameserver struct {
    Players int
    Mutex   *sync.Mutex
}

func newGameServer() gameserver {
    gs := gameserver{}
    gs.Players = 0
    gs.Mutex = &sync.Mutex{}
    return gs
}

func (gs *gameserver) changeplayers() {
    i := 0
    for i < 1000000 {
        gs.Mutex.Lock()
        gs.Players++
        gs.Mutex.Unlock()
        i++
    }
}

func main() {
    a := newGameServer()
    b := newGameServer()
    go a.changeplayers()
    go b.changeplayers()
    fmt.Printf("%p\n%p", &a.Mutex, &b.Mutex)
}
go struct locking mutex goroutine
1个回答
1
投票

因为每当我在任何互斥锁上设置锁定时,所有变量都被锁定?

这没有任何意义。互斥锁保持锁定状态。调用其Lock()Unlock()方法会根据其状态同步goroutine。单独的互斥锁值具有单独的不同状态。

将互斥量添加到结构中是完全正常的,甚至可以将其嵌入:When do you embed mutex in struct in Go?效果是您期望的:互斥体可用于保护对包含结构体值的并发访问,但其他结构值不受影响。 2个并发的goroutine可以更新2个单独的结构值,但是最多可以有1个goroutine同时访问相同的结构值。

© www.soinside.com 2019 - 2024. All rights reserved.