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);
}
Aprenda a Gerenciar Permissões de Arquivos no Linux
Como transformar um áudio em vídeo com efeito de forma de onda (wave form)
Como aprovar Pull Requests em seu repositório Github via linha de comando
Mantenha seu Sistema Leve e Rápido com a Limpeza do APT!
Procurando vídeos de YouTube pelo terminal e assistindo via mpv (2025)
Gravação de tela com temporizador
como instalo panfrost-dri e o driver panfrost fork , ou panfrost (16)
problema no debian que poderia ser corrigido por comando? (12)
Usar uma VM dentro do meu notebook como firewall para um dispositivo e... (0)
Eu tive esse erro aqui depois de de baixar o HyprLand Ubuntu na versão... (1)