Junior — Middle
Qual é a finalidade do mecanismo de semáforo na programação multithread?
sobes.tech IA
Resposta da IA
Um semáforo na programação multithread é usado para gerir o acesso a recursos partilhados, limitando o número de threads que podem usar esse recurso simultaneamente. Ele mantém um contador que diminui quando o recurso é adquirido e aumenta quando é libertado. Se o contador for zero, os novos threads ficam bloqueados até que o recurso seja libertado.
Exemplo em Go usando um canal como semáforo:
package main
import (
"fmt"
"sync"
)
func main() {
var wg sync.WaitGroup
sem := make(chan struct{}, 3) // semáforo com contador máximo de 3
for i := 0; i < 10; i++ {
wg.Add(1)
go func(id int) {
defer wg.Done()
sem <- struct{}{} // aquisição do recurso
fmt.Printf("Goroutine %d começou a trabalhar\n", id)
// simulação de trabalho
// time.Sleep(time.Second)
fmt.Printf("Goroutine %d terminou de trabalhar\n", id)
<-sem // libertação do recurso
}(i)
}
wg.Wait()
}
Assim, o semáforo ajuda a controlar o acesso concorrente e previne condições de corrida e sobrecarga de recursos.