Контест Middle sync и атомики обновлено
Глобальный максимум через CompareAndSwap
Условие
Найдите максимум массива и сколько раз он встречается. Массив делится на w частей, каждую обрабатывает своя горутина. Горутины обновляют общий максимум через atomic.Int64.CompareAndSwap без мьютекса. Счётчик вхождений тоже атомарный.
Ввод: n w (1 ≤ n ≤ 1.5·10⁴, 1 ≤ w ≤ 32), затем n целых чисел (по модулю до 10¹⁸).
Вывод: максимум и число его вхождений.
Решение должно быть конкурентным (горутины), а вывод не должен зависеть от порядка их выполнения.
Пример
6 2
3 9 1 9 2 9
9 3
Как подойти
Локальные max и count в горутине, CAS-цикл для глобального max, второй этап для счётчика.
Решите в тренажёре
Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.
Ещё по теме «sync и атомики»
- Шардированная мапа с мьютексом на шард
- Что выведет Go: atomic.Int64 из 100 горутин
- Что выведет Go: sync.Once и OnceValue
- Код-ревью Go: кеш на RWMutex
- Код-ревью Go: ленивый синглтон и горячая перезагрузка конфига
- Типизированные атомики
- Атомики или мьютекс
- CompareAndSwap