У меня есть рекурсивная функция, которая блокирует и изменяет ее внутреннее состояние, однако это вызывает тупик. Как я могу реализовать такую рекурсивную функцию без взаимоблокировки?
package main
import (
"fmt"
"sync"
)
type runner struct {
sync.Mutex
value int
}
func (r *runner) decrement() {
r.Lock()
defer r.Unlock()
if r.value == 0 {
return
}
r.value--
r.decrement()
}
func main() {
r := runner{
value: 10,
}
r.decrement()
fmt.Printf("r: %v\n", r.value)
}
Ожидается, что выполнение приведенного выше кода выдаст r: 0
, но фактически получит взаимоблокировку:
fatal error: all goroutines are asleep - deadlock!