Объявление нескольких * syn c .Mutex переменных в разных структурах - PullRequest
0 голосов
/ 18 апреля 2020

Чтобы сделать мою программу более эффективной, могу ли я связать переменную * syn c .Mutex со структурой, чтобы при выполнении a.Mutex.Lock () она блокировала только операцию goroutines на игровом сервере?

Или это ничего не меняет (потому что когда я устанавливаю Lock на любой мьютекс, все переменные блокируются?), Если я объявляю переменную * syn c .Mutex как глобальную и затем вызывать то же самое с каждого отдельного игрового сервера? пример:

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)
}

1 Ответ

1 голос
/ 18 апреля 2020

потому что всякий раз, когда я устанавливаю блокировку для любого мьютекса, все переменные блокируются?

Это не имеет никакого смысла. Мьютекс удерживает состояние блокировки. Вызов его методов Lock() и Unlock() синхронизирует процедуры на основе его состояния. Отдельные значения мьютекса имеют отдельные, разные состояния.

Добавление мьютекса в структуру совершенно нормально и обычно, вы даже можете встраивать его: Когда вы встраиваете мьютекс в структуру в Go? Эффект тот, который вы ожидаете: мьютекс может быть использован для защиты одновременного доступа к содержащему значение структуры, но другие значения структуры не применяются. 2 одновременных программы могут обновлять 2 отдельных значения структуры, но не более 1 последовательности могут одновременно обращаться к одному и тому же значению структуры.

...