tgoop.com/golang_interview/1268
Create:
Last Update:
Last Update:
🔧 Задача для собеседования на Go: Реализация кастомной WaitGroup на семафоре
Условие:
Нужно реализовать аналог sync.WaitGroup с использованием семафора на базе канала. Семафор должен ожидать завершения N горутин, используя минимальные аллокации памяти.
Решение:
package main
import (
"fmt"
)
type sema chan struct{}
func New(n int) sema {
return make(sema, n)
}
func (s sema) Inc(k int) {
for i := 0; i < k; i++ {
s <- struct{}{}
}
}
func (s sema) Dec(k int) {
for i := 0; i < k; i++ {
<-s
}
}
func main() {
numbers := []int{1, 2, 3, 4, 5}
n := len(numbers)
sem := New(n)
for _, num := range numbers {
go func(n int) {
fmt.Println(n)
sem.Inc(1)
}(num)
}
sem.Dec(n)
}
Пояснение:
1️⃣ Семафор реализован как канал пустых структур
chan struct{}
для минимизации аллокаций2️⃣ Буферизированный канал создается с размером, равным количеству горутин
3️⃣ Каждая горутина при завершении кладет значение в канал (
Inc
)4️⃣ Главная горутина ожидает завершения всех горутин, вычитывая значения (
Dec
)5️⃣ Когда все горутины завершатся, канал опустеет и выполнение продолжится
@golang_interview
BY Golang вопросы собеседований
Share with your friend now:
tgoop.com/golang_interview/1268