Deadlock можно получить, если две горутины захватят два mutex в противоположном порядке. Барьер делает пример воспроизводимым, без надежды на случайный scheduling.
Смоделируйте deadlock в конкурентной Go-программе с двумя горутинами.
Deadlock можно получить, если две горутины захватят два mutex в противоположном порядке. Барьер делает пример воспроизводимым, без надежды на случайный scheduling.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Deadlock можно получить, если две горутины захватят два mutex в противоположном порядке. Барьер делает пример воспроизводимым, без надежды на случайный scheduling.
package main
import "sync"
func main() {
var a, b sync.Mutex
readyA, readyB := make(chan struct{}), make(chan struct{})
var wg sync.WaitGroup
wg.Add(2)
go func() {
defer wg.Done()
a.Lock()
defer a.Unlock()
close(readyA)
<-readyB
b.Lock()
b.Unlock()
}()
go func() {
defer wg.Done()
b.Lock()
defer b.Unlock()
close(readyB)
<-readyA
a.Lock()
a.Unlock()
}()
wg.Wait()
}
Программа намеренно блокируется: каждый держит ресурс, нужный другому. Исправление — единый порядок захвата, например всегда a, затем b. Пример демонстрационный, не для запуска в рабочем сервисе.