Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <pthread.h>
- #include <unistd.h>
- /*
- Appello 3 del 14.09.2010 - A.A. 2009/2010
- Realizzate un programma multi thread in C, completo di commento, che svolga quanto segue: il thread iniziale che
- esegue il main crea due thread TH1 e TH2. I due thread condividono due variabili intere S1 e S2 sulle quali
- operano in mutua esclusione. TH1 genera periodicamente, ogni secondo, un numero casuale compreso tra 1 e 50 e
- lo sottrae a S1 se il numero estratto è dispari, mentre lo sottrae a S2 se il numero estratto è pari. TH2 genera
- periodicamente, ogni due secondi, un numero casuale compreso tra 1 e 100 e lo aggiunge ad S1 ed incrementa di 1
- il valore di S2. Il programma termina quando TH1 verifica che il valore della somma S1+S2 ha superato il valore
- 1000. Prima della terminazione del programma il thread main stampa su schermo il valore finale della somma S1+S2.
- */
- int S1 = 0;
- int S2 = 0;
- int somma = 0;
- int fine = 0;
- pthread_mutex_t M;
- int get_random(int min, int max) {
- return (rand() % (max - min + 1)) + min;
- }
- void *codiceTh1(void *arg){
- if(somma > 1000){
- fine = 1;
- } else {
- int x = get_random(1, 50);
- pthread_mutex_lock(&M);
- if (x%2 != 0){
- S1 = S1 - x;
- fprintf(stdout, "Ho sottratto %d a S1\n", x);
- } else {
- S2 = S2 - x;
- fprintf(stdout, "Ho sottratto %d a S2\n", x);
- }
- pthread_mutex_unlock(&M);
- sleep(1);
- }
- }
- void *codiceTh2(void *arg){
- if(fine == 0){
- int x = get_random(1, 100);
- pthread_mutex_lock(&M);
- S1 = S1 + x;
- S2++;
- fprintf(stdout, "Ho aggiunto %d a S1\n", x);
- pthread_mutex_unlock(&M);
- sleep(2);
- }
- }
- int main(){
- pthread_t th1, th2;
- pthread_mutex_init(&M, NULL);
- while(fine == 0){
- if(pthread_create(&th1, NULL, codiceTh1, (int*)0) != 0){
- fprintf(stderr, "Errore creazione thread 1\n");
- exit(1);
- }
- if(pthread_create(&th2, NULL, codiceTh2, (int*)0) != 0){
- fprintf(stderr, "Errore creazione thread 2\n");
- exit(1);
- }
- somma = S1 + S2;
- fprintf(stdout, "La somma è %d\n", somma);
- if(pthread_join(th1, NULL) != 0){
- fprintf(stderr, "Errore join\n");
- }
- if(pthread_join(th2, NULL) != 0){
- fprintf(stderr, "Errore join\n");
- }
- }
- fprintf(stdout, "Ho finito, ciao!\n");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement