为了使我的程序更高效,我可以将* 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)
}
因为每当我在任何互斥锁上设置锁定时,所有变量都被锁定?
这没有任何意义。互斥锁保持锁定状态。调用其Lock()
和Unlock()
方法会根据其状态同步goroutine。单独的互斥锁值具有单独的不同状态。
将互斥量添加到结构中是完全正常的,甚至可以将其嵌入:When do you embed mutex in struct in Go?效果是您期望的:互斥体可用于保护对包含结构体值的并发访问,但其他结构值不受影响。 2个并发的goroutine可以更新2个单独的结构值,但是最多可以有1个goroutine同时访问相同的结构值。