Sobes.tech
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.