Практика на синхронизацию в Go
Дан следующий код:
var sum int
var wg sync.WaitGroup
func addOne(wg *sync.WaitGroup) {
defer wg.Done()
sum++
}
Защитите sum замком, запустите
пятнадцать веток и выведите итог после
ожидания группы.
Дан следующий код:
var mu sync.RWMutex
var balance int = 100
func readBal(wg *sync.WaitGroup) {
defer wg.Done()
fmt.Println(balance)
}
Сделайте readBal безопасным
чтением и запустите четыре параллельные
ветки.
Дан следующий код:
var cfg sync.Once
var port int
func boot() {
cfg.Do(func() {
port = 8080
})
}
Вызовите boot из трех горутин
с ожиданием и выведите port.
Дан следующий код:
var cnt atomic.Int64
var wg sync.WaitGroup
func tick(wg *sync.WaitGroup) {
defer wg.Done()
cnt.Add(1)
}
Запустите tick тридцать раз,
дождитесь веток и выведите значение
счетчика.
Дан следующий код:
var n int
var wg sync.WaitGroup
func work(wg *sync.WaitGroup) {
defer wg.Done()
n += 2
}
Добейтесь итога "20" после десяти
веток, используя либо замок, либо
атомарный счетчик с шагом два.
Дан следующий код:
var mu sync.Mutex
var shared map[string]int
func note(key string) {
mu.Lock()
defer mu.Unlock()
shared[key]++
}
Скажите, зачем здесь нужен замок, если
note уже вызывают из разных горутин.