Как безопасно добавить новую пару ключ-значение в исходную карту - PullRequest
0 голосов
/ 29 октября 2019

Я хочу добавить новую пару ключ-значение в карту Голанга из параллельных потоков. Проблема в том, что если на карте присутствует ключ, мы не создаем новую пару. С точки зрения многопоточности, как проверить текущее состояние и, если ключа нет, вставить значение ключа.

Также я не хочу использовать структуру данных sync.Map по нескольким причинам. Я думал о схеме двойной проверки для этого сценария.

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

Ответы [ 2 ]

2 голосов
/ 29 октября 2019

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

Нет. Вам нужна правильная синхронизация.

0 голосов
/ 29 октября 2019

Я бы порекомендовал комбинацию sync.Map для хранения значений ключа и sync.Once внутри значения для выполнения одноразовой инициализации.

Вот пример:

type Value struct {
    init       sync.Once
    someValue  string
}

func (v *Value) Init() {
    v.init.Do(func() {
        // This function will only be executed one time
        v.someValue = "initialized"
    })
}

func main() {
    var m sync.Map

    v1, _ := m.LoadOrStore("key", &Value{})
    v1.(*Value).Init() // init function is called

    v2, _ := m.LoadOrStore("key", &Value{})
    v2.(*Value).Init() // init function is not called
}
...