Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗goSpSyPrm 172 of 280 menu
◀ ▶

Практика на синхронизацию в 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 уже вызывают из разных горутин.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить