salve prof vuole un caffe?

 avatar
unknown
c_cpp
2 months ago
2.9 kB
4
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;	
}
Leave a Comment