Created
January 22, 2020 20:24
-
-
Save Lucchetto/1674554ea7301366de1a52b6daae40e3 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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