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);
}
Como gerar qualquer emoji ou símbolo unicode a partir do seu teclado
Instalar e Configurar o Slackware Linux em 2025
Como configurar os repositórios do apt no Debian 12 em 2025
Passkeys: A Evolução da Autenticação Digital
Instalação de distro Linux em computadores, netbooks, etc, em rede com o Clonezilla
Muitas dificuldades ao instalar distro Linux em Notebook Sony Vaio PCG-6131L (VPCEA24FM)
Slackpkg+ (Slackpkg Plus) está de volta!
Como dividir duas janelas igualmente e lado-a-lado na sua tela
Configurando o Conky para iniciar corretamente no sistema
3 configurações básicas que podem melhorar muito a sua edição pelo editor nano
Erro de segmentação «Segmentation fault (core dumped)» ao retornar obj... (6)
Não Consigo instalar o cli-visualizer no Ubuntu 24.04 (2)
compilação samba 4.22 rock linux 9.5 (1)
Posso instalar usar o grub sem ter linux instalado, para iniciar o win... (1)
Ocomon 6.0.1 - Problemas ao editar configurações estendidas (4)