Visualizzazione dei risultati da 1 a 2 su 2
  1. #1

    [C] Problema Sincronizzazione Thread - Stallo

    Cerco di descrivere al meglio il mio problema

    Nel commento iniziale c'è scritto cosa dovrebbe fare il programmino. Tutto sembra funzionare eccetto che.. Quando l'ultima auto in un senso termina l'attraversamento del ponte, e quindi dovrebbe liberare il passaggio per quelle in coda all'altro lato, questo non accade, causando uno stallo che non si sblocca più. FORSE , e dico forse, data la mia non eccelsa esperienza, potrebbe essere dovuto al fatto che quando l'ultima auto esce, non riesce a fare la "post" sul semaforo "ponte" per liberarlo, poichè le auto da sud sono in sezione critica sullo stesso semaforo!

    Qualcuno saprebbe suggerirmi come posso risolvere questo problema? :s

    Ringrazio anticipatamente chiunque mi aiutera

    codice:
    //Strada a due corsie e doppio senso di marcia
    
    //vi è un ponte ad UNA SOLA corsia percorribile a senso unico alternato
    //Il ponte ha una capacità di N automobili
    
    //Le automobili dirette verso Nord (o Sud) possono attraversare il ponte
    //solo se non è attraversato da nessuna automobile diretta nel senso opposto
    
    //Generare l'arrivo delle macchine da Nord e Sud in modo casuale
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <pthread.h>
    #include <semaphore.h>
    
    #define N 4
    #define TOT 15
    
    void *transito_da_sud(void*args);
    void *transito_da_nord(void*args);
    
    void auto_da_sud();
    void auto_da_nord();
    
    int passate = 0;
    int capacita = N;
    int autonord = 0;
    int autosud = 0;
    
    sem_t posti;
    sem_t ponte;
    
    pthread_mutex_t mutex;
    
    int main() {
      
      pthread_t da_nord;
      pthread_t da_sud;
      
      sem_init(&ponte, 0, 1);
      sem_init(&posti, 0, N);
      
      pthread_mutex_init(&mutex, NULL);
      
      while(1) {
        
        int delay = rand() % 14;
        sleep(delay);
        
        if(passate >= TOT) {						//
          printf("Il ponte è crollato. Non si passa più\n");	// Il blocco di controllo che fa terminare l'esecuzione
          break;							                //	
        }
        else {								                        //
          int NS = rand() % 2;						                //
          if (!NS) {							                        //
    	  auto_da_nord();						                //
    	  pthread_create(&da_nord, NULL, transito_da_nord, NULL);	//
    								                                //
          }									                        //	BLOCCO per l'arrivo casuale delle auto
          else {								                        //
    	  auto_da_sud();						                        //
    	  pthread_create(&da_sud, NULL, transito_da_sud, NULL);	//
    								                                //
          } 								                        //
        }									                        //
      }
      return 0;
    }
      
    
    void *transito_da_nord(void*args) {
      
      pthread_mutex_lock(&mutex);
        autonord++;
        if (autonord == 1) {
          sem_wait(&ponte);
        }
      pthread_mutex_unlock(&mutex);  
    
      if(capacita == 0) printf("Non ci sono posti sul ponte.. L'auto proveniente da nord attende..");
     
      sem_wait(&posti);
      
      pthread_mutex_lock(&mutex);
        capacita--;
      pthread_mutex_unlock(&mutex);
      
        printf("Un'auto proveniente da nord è entrata nel ponte \n");
        sleep(5);
        printf("Un'auto proveniente da nord è uscita dal ponte \n");
        
      sem_post(&posti);
        
      pthread_mutex_lock(&mutex);
        capacita++;
        passate++;
        autonord--; 
       
        if(autonord == 0) {
          sem_post(&ponte);
        }
      pthread_mutex_unlock(&mutex);  
    }  
    
    void *transito_da_sud(void*args) {
      
      pthread_mutex_lock(&mutex);
        autosud++;
        if (autosud == 1) {
          sem_wait(&ponte);
        }
      pthread_mutex_unlock(&mutex); 
       
      if(capacita == 0) printf("Non ci sono posti sul ponte.. L'auto proveniente da sud attende..");
     
      sem_wait(&posti);
      
      pthread_mutex_lock(&mutex);
        capacita--;
      pthread_mutex_unlock(&mutex);
      
        printf("Un'auto proveniente da sud è entrata nel ponte \n");
        sleep(5);
        printf("Un'auto proveniente da sud è uscita dal ponte \n");
        
      sem_post(&posti);
        
      pthread_mutex_lock(&mutex);
        capacita++;
        passate++;
        autosud--;
        if(autosud == 0) {
          sem_post(&ponte);
        }
      pthread_mutex_unlock(&mutex);
    }
    
    void auto_da_nord() {
      	printf("Arriva una macchina da Nord\n");
    }
    
    void auto_da_sud() {
      	printf("Arriva una macchina da Sud\n");
    	
    }

  2. #2
    Ho risolto, mediante l'utilizzo di non più un solo
    codice:
    mutex
    , ma diversi mutex
    codice:
    mutex1, mutex2, ..
    a seconda del tratto di codice che volevo sincronizzare

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 © 2025 vBulletin Solutions, Inc. All rights reserved.