Enviado em 15/05/2019 - 20:09h
Olá, fiz a resolução do enunciado abaixo e está funcionando perfeitamente, porém não sei se fiz o uso correto dos semáforos (nunca usei isso antes). Gostaria de saber se é assim que se utiliza ou se o que fiz não passa de uma gambiarra das mais medonhas.#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <errno.h>
#include <unistd.h>
#include <semaphore.h>
#define NUM_THREADS 3
int cont1 = 0;
int cont2 = 0;
sem_t t1;
struct WorkUnit
{
int temp;
};
void *tratador1 (void *param) {
int valor;
sem_getvalue (&t1, &valor);
if(valor == 0){
cont1++;
if(cont1 == 10){
printf("Tratador 1 utilizado \n\n");
cont1 = 0;
}
sem_post(&t1);
}
pthread_exit(NULL);
}
void *tratador2 (void *param) {
int valor2;
sem_getvalue (&t1, &valor2);
if(valor2 == 2){
cont2++;
if(cont2 == 10){
printf("Tratador 2 utilizado \n\n");
cont2 = 0;
}
sem_wait(&t1);
}
pthread_exit(NULL);
}
void *observador (void *param) {
struct WorkUnit *wu = param;
int temp = wu->temp;
printf("Valor recebido \n\n");
if(temp <= 40) { // condicao para decrementar o semaforo
sem_wait(&t1);
}else if(temp >= 50) { // condicao para incrementar o semaforo
sem_post(&t1);
}
pthread_exit(NULL);
}
int main (){
int terror;
int n;
int t;
void *(*functions[NUM_THREADS])(void *) = {tratador2, tratador1, observador};
int valor[0];
pthread_t tids [NUM_THREADS];
sem_init (&t1, 0, 1); //iniciando o semaforo
while (1) {
printf("Digite o valor: ");
scanf("%d", valor);
for (n=0; n<NUM_THREADS; n++) {
terror = pthread_create(&tids[n],NULL, functions[n], valor);
if (terror) {
errno = terror;
perror("Falha na criação da thread");
exit(EXIT_FAILURE);
}
}
for (t = 0; t < NUM_THREADS; t++) {
terror = pthread_join(tids[t], NULL);
if (terror)
{
errno = terror;
perror("Erro no Join!");
exit(EXIT_FAILURE);
}
}
}
pthread_exit(NULL);
}
Atualizando o Passado: Linux no Lenovo G460 em 2025
aaPanel - Um Painel de Hospedagem Gratuito e Poderoso
O macete do Warsaw no Linux Mint e cia
Visualizar arquivos em formato markdown (ex.: README.md) pelo terminal
Dando - teoricamente - um gás no Gnome-Shell do Arch Linux
Como instalar o Google Cloud CLI no Ubuntu/Debian
Mantenha seu Sistema Leve e Rápido com a Limpeza do APT!
Procurando vídeos de YouTube pelo terminal e assistindo via mpv (2025)
Jogos baixados na Central de Aplicativos mas que não abrem (1)
debian com wayland, configuracao de teclado. Mudou Tudo! [RESOLVIDO] (1)
Iinstalar o Scanner Kodak i940 no Linux Mint 19/20? (3)
Pastas da raiz foram para a área de trabalho [RESOLVIDO] (11)