Programmazione concorrente c

di il
4 risposte

Programmazione concorrente c

Come faccio a creare tre thread e farli eseguire uno dopo l'altro.

esempio
un thread stampa A un altro stampa B e il terzo stampa C

io come risultato devo avere SEMPRE ABCABC...

la soluzione con i turni funziona solo con 2 thread

posto la soluzione che non funziona.. anche se è inutile..
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <time.h>

//puntatore ad area di memoria condivisa
int *a;
int turno = 0; //0=turno produttore 1=turn consum

pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t condizione = PTHREAD_COND_INITIALIZER;

void *thread_p1(void *d) {
    while (1) {
        pthread_mutex_lock(&lock);

        if (turno == 1) {
            pthread_cond_wait(&condizione, &lock);
        }
	
	printf("A");
	
        turno = 1;
        pthread_cond_signal(&condizione);
        pthread_mutex_unlock(&lock);
    }
}


void *thread_p2(void *d) {
    while (1) {
        pthread_mutex_lock(&lock);

        if (turno == 0) {
            pthread_cond_wait(&condizione, &lock);
        }
	
	printf("B");
	

        turno = 0;
        pthread_cond_signal(&condizione);
        pthread_mutex_unlock(&lock);
    }

}


void *thread_p3(void *d) {
    while (1) {
        pthread_mutex_lock(&lock);

        if (turno == 2) {
            pthread_cond_wait(&condizione, &lock);
        }
	
	printf("C");

        turno = 2;
        pthread_cond_signal(&condizione);
        pthread_mutex_unlock(&lock);
    }
}



int main(int argc, char **argv) {
    printf("tutto ok\n");

    //alloco memoria
    a = calloc(2, sizeof (int));

    pthread_t th1, th2, th3;

    pthread_create(&th1, NULL, thread_p1, NULL);
    pthread_create(&th2, NULL, thread_p2, NULL);
    pthread_create(&th3, NULL, thread_p3, NULL);

    pthread_detach(th1);
    pthread_detach(th2);
	pthread_detach(th3);

    pthread_exit(NULL);
	
    return 0;
}

4 Risposte

  • Re: Programmazione concorrente c

    Concettualmente non ha senso: per fare quello che vuoi tu ti basta I'll main del programma.

    In alternativa ti servono due semafori: uno per sincronizzare i thread 1 e 2 e il secondo per i thread 2 e 3.

    Il mutex non va bene. Ovviamente
  • Re: Programmazione concorrente c

    Perchè i mutex no?
    -il main attiva Mutex1+mutex2
    -Lancia i thread
    -Thread1 scrive A e sblocca Mutex1
    -Thread2 era in attesa di Mutex1 ora è libero scrive B e sblocca Mutex2
    -Thread3 era in attesa di Mutex2 ora è sbloccato e scrive C

    Insomma una di queste logiche,la tua è decisamente da rivedere,concordo pienamente dell'inutilità del codice.
    Ricordo che il crossposting è severamente vietato.
  • Re: Programmazione concorrente c

    Un mutex (mutual exclusion) lo usi per far si che due thread non accedano allo stesso codice.
    Quello che serve e' un oggetto su cui un thread si mette in attesa: cioe' tenta di acquisire e si blocca fino a che qualcuno non lo rilascia.
    Questo lo fai con un semaforo.

    Ma si, in effetti un mutex e' un semaforo binario. Hai ragione.
    Spesso si seguono pattern consolidati senza pensarci
  • Re: Programmazione concorrente c

    Grazie ho capito.

    chiedo scusa per il crossposting capisco che è una cosa fastidiosa... ma spesso funziona perchè ti permette di contattare più gente..cmq non lo sapevo che non si poteva fare. la prossima volta chiedo solo qui.

    grazie a presto.
Devi accedere o registrarti per scrivere nel forum
4 risposte