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.