Dúvida sobre funcionamento de threads/semáforos em C

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.

Obrigado a quem puder ajudar :slight_smile:

Escreva um programa formado por três processos concorrentes: observador,
tratador1 e tratador2. Os processos devem executar um loop infinito, e sincronizar
suas ações com o uso de semáforos. O processo observador lê valores inteiros,
que representam a temperatura do processador durante seu uso. Se o valor lido é
menor ou igual a 40, deve ser notificado o processo tratador1. Caso o valor seja
maior que 50, deve ser notificado o processo tratador2. Cada processo tratador
deverá fazer um printf a cada 10 notificações recebidas.

#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);
}