salve prof vuole un caffe?
#include <pthread.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <time.h> #include <stdbool.h> #include <signal.h> typedef struct { int start; int end; } input_t; int val; int a[100]; pthread_mutex_t mx; pthread_mutex_t mx2; pthread_mutex_t mx3; int out; pthread_t tmain; pthread_t t1, t2; pthread_t tid; int tcont=0; void handler(int signal) { printf("\n segnale ricevuto dal thread \n"); if (tid==t1) tcont=1; else tcont=2; pthread_mutex_unlock(&mx3); } void *ricerca(void *in) { input_t *pin; pin = (input_t *) in; int s = pin->start; int e = pin->end; pthread_mutex_unlock(&mx2); printf("\n Ricerca s=%d e=%d del thread %d \n",s,e, (int) pthread_self()); while ( (a[s]!=val) && (s<=e)) s++; pthread_mutex_lock(&mx); if ( s<=e ) { out = s; printf("\n Ricerca out = %d del thread %d \n", out, (int) pthread_self()); } else { out = 1000; printf("\n Ricerca out = %d del thread %d \n", out, (int) pthread_self()); } pthread_mutex_lock(&mx3); tid=pthread_self(); pthread_kill(tmain,SIGUSR1); pthread_exit((void *) &out); } int main() { int *ptr; int risultato; input_t input; for (int i=0; i<100; i++) a[i]=2*i; printf("\n Inserisci il valore da cercare \n"); scanf("%d",&val); pthread_mutex_init (&mx, NULL); pthread_mutex_init (&mx2, NULL); pthread_mutex_init (&mx3, NULL); tmain=pthread_self(); signal(SIGUSR1,handler); input.start = 0; input.end = 49; pthread_mutex_lock(&mx2); pthread_create(&t1, NULL, &ricerca, (void *) &input); printf("\n Thread creato %d \n", (int) t1); pthread_mutex_lock(&mx2); input.start = 50; input.end = 99; pthread_create(&t2, NULL, &ricerca, (void *) &input); printf("\n Thread creato %d \n", (int) t2); while (tcont==0) ; signal(SIGUSR1,SIG_IGN); if (tcont==1) { pthread_join(t1, (void **) &ptr); risultato = *ptr; pthread_mutex_unlock(&mx); if (risultato<50) { pthread_cancel(t2); printf("\n Il valore è stato trovato al posto %d dal thread %d \n", risultato, (int) t1); } else { pthread_join(t2, (void **) &ptr); risultato = *ptr; pthread_mutex_unlock(&mx); if (risultato<100) printf("\n Il valore è stato trovato al posto %d dal thread %d \n", risultato, (int) t2); else printf("\n Il valore non è stato trovato \n"); } } else { pthread_join(t2, (void **) &ptr); risultato = *ptr; pthread_mutex_unlock(&mx); if (risultato<100) { pthread_cancel(t1); printf("\n Il valore è stato trovato al posto %d dal thread %d \n", risultato, (int) t2); } else { pthread_join(t1, (void **) &ptr); risultato = *ptr; pthread_mutex_unlock(&mx); if (risultato<50) printf("\n Il valore è stato trovato al posto %d dal thread %d \n", risultato, (int) t1); else printf("\n Il valore non è stato trovato \n"); } } return 0; }
Leave a Comment