Синхронизировать доступ для той же переменной - PullRequest
0 голосов
/ 13 февраля 2019

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

func update1(int id){
   ...
   makeUpdate(id)
   ...
}

func update2(int id){
   ...
   makeUpdate(id)
   ...
}

Итак, как мне написать мою функцию makeUpdate (), чтобы блок myUpdate выполнялся только один раз для данного значения идентификатора?Это означает, что если update1 обновляет запись с идентификатором «15» и update2 с идентификатором «20», доступ к блоку не должен синхронизироваться.

1 Ответ

0 голосов
/ 15 февраля 2019

Как отмечается в комментариях - вам нужно защитить доступ к данным, а не функциональный доступ.

Самый простой способ добиться этого - создать тип структуры с блокировкой - и прикрепить критическое функциональное обновление в качестве метода, например

type MyData struct {
        l sync.Mutex
        // add any other task related attributes here too
}

// makeUpdate *MUST* use a pointer to our struct (i.e. 'm *MyData')
// as Mutex logic breaks if copied (so no 'm MyData')
func (m *MyData) makeUpdate(id int) {
        m.l.Lock()
        defer m.l.Unlock()

        fmt.Printf("better makeUpdate(%d)\n", id) 

        // do critical stuff here

        // don't dilly-dally - lock is still being used - so return quickly
}

Попробуйте это на игровой площадке .

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