В пределах Kubernetes Go repo on Github.com,Имеет ли следующий код без блокировки состояние гонки?
Существует блокировка реализации структуры данных HighWaterMark. Этот код опирается на атомные операции для обеспечения безопасного потока, который не содержит данных.
// HighWaterMark is a thread-safe object for tracking the maximum value seen
// for some quantity.
type HighWaterMark int64
// Update returns true if and only if 'current' is the highest value ever seen.
func (hwm *HighWaterMark) Update(current int64) bool {
for {
old := atomic.LoadInt64((*int64)(hwm))
if current <= old {
return false
}
if atomic.CompareAndSwapInt64((*int64)(hwm), old, current) {
return true
}
}
}
Этот код основан на функциях atomic.LoadInt64
и atomic.CompareAndSwapInt64
в стандартной библиотеке для достижения гонки данных свободного кода ... который я считаю, что это делает, но я верю, что есть еще одна проблема состояния гонки.
Если два конкурирующих потока (goroutines
) выполняют такой код, то существует край, где после того, как в первом потоке встречается atomic.LoadInt64
, второй поток мог бы поменять место на более высокое значение. Но после первого потока считаетcurrent
int64 фактически больше, чем old
int64 произойдет обмен. Этот обмен затем будет эффективно уменьшать сохраненное значение из-за наблюдения за устаревшим значением old
.
Aha! Он только что щелкнул меня после прочтения вашего ответа примерно 5 раз. –