Присваивает ли значение struct atomi c in go? - PullRequest
0 голосов
/ 23 марта 2020

У меня есть две структуры App и Config.

type App struct {
    cfg Config
}
type Config struct {
    dbHost   string
    dbPort   int
    user     string
    password string
}

и два метода, определенных в приложении, для обновления и чтения cfg поля.

func (app *App) UpdateConfig(newCfg Config) {
    app.cfg = newCfg
}

func (app *App) GetConfig() Config {
    return app.cfg
}

Если только одна процедура вызывает UpdateConfig, и несколько процедур читает конфигурацию с помощью метода GetConfig, я должен защитить доступ к app.cfg с помощью мьютекса?

Редактировать: Программы чтения вызывают GetConfig в течение 1 oop. Просмотр обновленного значения конфига "мгновенно" не является обязательным требованием. Читатели могут увидеть обновленное значение cfg на следующей итерации.

Поэтому я перефразирую свой вопрос: возможно ли для читателя увидеть частично обновленное значение конфигурации?

1 Ответ

4 голосов
/ 23 марта 2020

Нет, вы не должны ожидать увидеть все или ничего из обновленного конфига, если вы изменили его асинхронно.

Go пытается быть разумным (даже если это формально не гарантирует это); если вы обновите объект размером со слово в архитектуре, где обновления в размере слова не могут порваться, то вы увидите обновление или нет, даже если не синхронизируете. (Это отличается от C и C ++, где неопределенное поведение означает, что компилятор может законно делать что угодно). Но здесь Config - это большое значение, и нет дешевого способа, которым go мог бы гарантировать обновление по принципу «все или ничего» (без выполнения какой-либо синхронизации).

Но да, вы должны использовать мьютекс для защиты конфига. Если есть слишком много споров, и вы не возражаете против старых конфигов на некоторое время, то вы можете периодически опрашивать официальную конфигурацию и обновлять локальную копию при ее изменении.

Прагматически, мьютексы быстрые, и это почти всегда лучше иметь правильный асин c -код, даже если он немного медленнее. Например, если у вас нет асинхронного c -корректного кода, вы не можете легко использовать детектор гонки для поиска других подлинных проблем, даже если ваш код ведет себя так, как вы хотите.

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