Должен ли я защищать объект структуры с помощью мьютекса? - PullRequest
0 голосов
/ 25 мая 2019

Я использую 4 процедуры go, чтобы назначить различные переменные-члены экземпляра структуры.Каждая переменная-член доступна только для одной процедуры go.

Нужно ли добавлять мьютекс при доступе к экземпляру структуры?

Я не уверен, что подпрограммы 4 go обращаются к одной и той же памяти.Я чувствую, что должен быть, потому что все они обращаются к владельцу.

Этот код демонстрирует, что я делаю.

package main

import (
    "fmt"
    "sync"
)

func main() {
    var wg sync.WaitGroup
    var res Response

    var mu sync.Mutex

    wg.Add(1)
    go func() {

        defer wg.Done()
        mu.Lock()
        defer mu.Unlock()
        res.A = []string{"a"}
    }()

    wg.Add(1)
    go func() {
        defer wg.Done()
        mu.Lock()
        defer mu.Unlock()
        res.B = "b"
    }()

    wg.Add(1)
    go func() {
        defer wg.Done()
        mu.Lock()
        defer mu.Unlock()
        res.C = 100
    }()

    wg.Add(1)
    go func() {
        defer wg.Done()
        mu.Lock()
        defer mu.Unlock()
        res.D = map[string]string{
            "d": "dd",
        }
    }()

    wg.Wait()

    fmt.Println(res)

}

type Response struct {
    A []string
    B string
    C int
    D map[string]string
}

1 Ответ

2 голосов
/ 26 мая 2019

Вам не нужен мьютекс для этой программы. Что касается модели памяти Go, отдельные поля структуры являются отдельными переменными. Поскольку четыре программы обращаются к четырем отдельным (под) переменным, гонки данных не происходит, даже без мьютекса.

Вы можете убедиться в этом, удалив мьютекс и запустив программу с включенным детектором гонки: https://golang.org/doc/articles/race_detector.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...