Sobes.tech
Junior — Middle

Pode explicar o que é um mecanismo de semáforo na programação e como ele é usado para sincronizar threads?

sobes.tech IA

Resposta da IA

O semáforo é um mecanismo de sincronização utilizado para controlar o acesso de múltiplas threads a um recurso limitado.

Ele contém um contador que indica quantas threads podem acessar o recurso simultaneamente. Quando uma thread deseja entrar na seção crítica, ela realiza a operação "wait" (ou P), diminuindo o contador. Se o contador ficar negativo, a thread é bloqueada. Quando a thread sai da seção crítica, ela realiza a operação "signal" (ou V), aumentando o contador e desbloqueando as threads em espera.

Exemplo de uso de semáforo em C++ com API POSIX:

#include <semaphore.h>
#include <pthread.h>
#include <iostream>

sem_t semaphore;

void* worker(void* arg) {
    sem_wait(&semaphore); // aquisição do recurso
    std::cout << "A thread está trabalhando\n";
    // trabalho com o recurso
    sem_post(&semaphore); // liberação do recurso
    return nullptr;
}

int main() {
    sem_init(&semaphore, 0, 3); // permitimos até 3 threads simultaneamente
    pthread_t threads[5];
    for (int i = 0; i < 5; ++i) {
        pthread_create(&threads[i], nullptr, worker, nullptr);
    }
    for (int i = 0; i < 5; ++i) {
        pthread_join(threads[i], nullptr);
    }
    sem_destroy(&semaphore);
    return 0;
}

Dessa forma, o semáforo permite limitar o número de threads que trabalham simultaneamente com um recurso, prevenindo condições de corrida e garantindo a correção.