Сам фрагмент ничего не печатает. При последовательных вызовах Send выполняется на каждом сотом вызове Do; конкурентные вызовы создают гонку счётчика.
Какой вывод получит консоль в примере №36
Сам фрагмент ничего не печатает. При последовательных вызовах Send выполняется на каждом сотом вызове Do; конкурентные вызовы создают гонку счётчика.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Определите, что будет напечатано после выполнения программы и присутствуют ли в ней ошибки.
var counter int
type Trace struct {
}
type Sender interface {
Send(Trace)
}
func Do(sender Sender, t Trace) {
counter++
if counter == 100 {
sender.Send(t)
counter = 0
}
}
Ответ
Сам фрагмент ничего не печатает. При последовательных вызовах Send выполняется на каждом сотом вызове Do; конкурентные вызовы создают гонку счётчика.
Без реализации Sender и вызовов Do точный консольный вывод определить нельзя. counter общий для всех sender: это не отдельный счётчик на получателя.
Для параллельной работы изменение счётчика и решение «нужно отправить» защищают одним mutex. Сам Send лучше выполнять вне блокировки, если не требуется строгий порядок отправок. Ошибка или паника отправки, её повтор и сохранение накопленного состояния требуют отдельной политики: текущий интерфейс Send даже не возвращает error.