Skip to content

Instantly share code, notes, and snippets.

@Lucchetto
Created January 22, 2020 20:24
Show Gist options
  • Save Lucchetto/1674554ea7301366de1a52b6daae40e3 to your computer and use it in GitHub Desktop.
Save Lucchetto/1674554ea7301366de1a52b6daae40e3 to your computer and use it in GitHub Desktop.
#include <iostream>
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
using namespace std;
// Imposto scritto a false per mettere il thread controllo_ingressi in attesa
// e imposto letto a true per procedere alla lettura degli ingressi
bool scritto, letto = true;
int input[4];
int old_input[4];
// Creo un mutex, e due variabili condizione
pthread_mutex_t mutex_ingressi = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond_scrittura = PTHREAD_COND_INITIALIZER;
pthread_cond_t cond_lettura = PTHREAD_COND_INITIALIZER;
// Thread che si occupa di prendere gli ingressi
void *ingressi(void *arg) {
while (true) {
// Blocco il mutex
pthread_mutex_lock(&mutex_ingressi);
// Se il thread controllo_ingressi non ha letto, mi metto in attesa
if (!letto) {
pthread_cond_wait(&cond_lettura, &mutex_ingressi);
}
// Acquisizione input
for (int i = 0; i < sizeof(input) / sizeof(input[0]); i++) {
cout<<"Input "<<i<<": ";
cin>>input[i];
}
// Imposto le condizioni
letto = false;
scritto = true;
// Invio il segnale di fine scrittura
pthread_cond_signal(&cond_scrittura);
// Sblocco il mutex
pthread_mutex_unlock(&mutex_ingressi);
}
pthread_exit(0);
}
// Thread che si occupa di verificare se l'input è cambiato
void *controllo_ingressi(void *arg) {
while(true) {
// Blocco il mutex
pthread_mutex_lock(&mutex_ingressi);
// Se il thread ingressi non ha ancora scritto, mi metto in attesa
if (!scritto) {
pthread_cond_wait(&cond_scrittura, &mutex_ingressi);
}
// Controllo l'ingresso
for (int i = 0; i < sizeof(input) / sizeof(input[0]); i++) {
if (old_input[i] != input[i]) {
old_input[i] = input[i];
cout<<"Input cambiato !"<<endl;
break;
}
}
// Imposto le condizioni
letto = true;
scritto = false;
// Invio il segnale di fine lettura
pthread_cond_signal(&cond_lettura);
// Sblocco il mutex
pthread_mutex_unlock(&mutex_ingressi);
}
pthread_exit(0);
}
int main() {
pthread_t t_ingressi, t_controllo_ingressi;
pthread_create(&t_ingressi, NULL, ingressi, NULL);
pthread_create(&t_controllo_ingressi, NULL, controllo_ingressi, NULL);
pthread_join(t_ingressi, NULL);
pthread_join(t_controllo_ingressi, NULL);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment