salve prof vuole un caffe?
unknown
c_cpp
10 months ago
2.9 kB
6
Indexable
#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;
}Editor is loading...
Leave a Comment