Visualizzazione dei risultati da 1 a 3 su 3

Discussione: [C] Incremento variabili da più thread ed output errato

  1. #1
    Utente di HTML.it L'avatar di hopeway
    Registrato dal
    Sep 2017
    residenza
    Catania
    Messaggi
    41

    [C] Incremento variabili da più thread ed output errato

    Salve a tutti, cercando di risolvere un esercizio banale sui thread (vi allego il testo)

    Una variabile intera x, inizializzata a 0, è condivisa tra 3 thread A, B e C. Ogni thread:
    1. attende un numero casuale di ms
    2. se la variabile condivisa x < 500 allora incrementa x altrimenti va al punto 5
    3. incrementa una variabile locale hit
    4. torna al punto 1
    5. mostra a schermo il valore di hit e termina la propria esecuzione
    Il programma termina quando tutti i thread hanno terminato la propria esecuzione.
    Implementare il sistema descritto proteggendo opportunamente la variabile x dagli accessi concorrenti.

    Dopo averlo scritto e compilato, l'eseguibile non fa vedere i processi di incremento della x, ma solamente le scritte di attesa. Sapreste dirmi cosa sbaglio dato che non sono molto pratico col C? Grazie mille in anticipo

    codice:
    #include<pthread.h>
    #include<stdio.h>
    #include<stdlib.h>
    #include<unistd.h>
    #include<time.h>
    
    
    int x = 0;
    pthread_t a,b,c;
    pthread_mutex_t mutex;
    
    
    void * function_a(){
    	int casual_ms = rand() % 100;
    	printf("Attendo %d ms..",casual_ms);
    	int hit_a = 0;
    	usleep(casual_ms);
    	if (x < 500 ){
    		pthread_mutex_lock(&mutex);
    		x++;
    		pthread_mutex_unlock(&mutex);
    		hit_a++;
    	}
    	else printf("Valore di hit_a: %d \n... Sto uscendo\n", hit_a);
    	pthread_exit(NULL);
    }
    
    
    int main (){
    	//srand(time(NULL));
    	pthread_mutex_init(&mutex,NULL);
    	pthread_create(&a,NULL,(void*)function_a,NULL);
    	pthread_create(&b,NULL,(void*)function_b,NULL);
    	pthread_create(&c,NULL,(void*)function_c,NULL);
    	
    	pthread_join(a,NULL);
    	pthread_join(b,NULL);
    	pthread_join(c,NULL);
    	
    	return 0;
    }
    (ho allegato solamente una funzione per snellire il codice, dato che sono tutte e 3 identiche, eccetto per il nome delle variabili)

  2. #2
    Utente di HTML.it L'avatar di linoma
    Registrato dal
    Mar 2010
    Messaggi
    1,355
    alla fine dei tuoi 3 threads chevalore ha la x? Dovrebbe avere 3 se nn sbaglio
    Per gli Spartani e Sparta usa spartan

  3. #3
    Del "torna al punto 1" nel tuo programma non c'è traccia, servirà un while.
    Quello che fa attualmente è controllare, incrementare entrambe le variabili e uscire, poiché la printf è nel ramo else dell'if principale.
    Così facendo x alla fine rimane 3.
    Attento che facendo il confronto fuori dal mutex, immaginando un while al posto dell'if, rischi di superare i 500 incrementi perché il thread potrebbe essere interrotto tra confronto e acquisizione della mutua esclusione anche se con un numero così basso, le sleep e i numeri casuali, che non usando srand() sono sempre i soliti, non dovrebbe accadere praticamente mai.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2018 vBulletin Solutions, Inc. All rights reserved.