Dynamische Anzahl an Threads



  • Hallo miteinander,
    Ich suche Hilfe für folgendes Programm:

    Ich simuliere ein Restaurant. es kommen in zufälligen Abständen Personen rein, verweilen eine zufällige Zeitspanne und verlassen das Rest wieder.
    Jeder Gast wird als ein Thread realisiert. Leider habe ich das Problem, dass bei printf immer die gleiche Thread- ID angezeigt wird- ergo wird anscheinend nur 1 Thread erzeugt...Hab ich möglicherweise ein falsches Konzept gewählt mit dem pthread_t- Array? Ich bin noch neu bei Thread- Programmiern, und dachte deshalb, das wär die beste Variante!
    Vielleicht kann mir wer helfen!

    Mein Quellcode sieht so aus:

    #include <stdlib.h>
    #include <stdio.h>
    #include <pthread.h>
    #include <unistd.h>
    
    #define CAPACITY 10
    #define EMPTY 0
    
    int used_seats=0;
    
    /*Method for visit.
     * A customer comes in, waits some (random) time and leaves
     */
    void* visitRestaurant (void *arg){
    used_seats++;
    printf("Customer %d (Thread %ld) -- Entering Restaurant\n",used_seats,(long)pthread_self);
    sleep(rand()%10);
    printf("Customer %d (Thread %ld) -- Leaving Resaturant\n",used_seats,(long)pthread_self);
    used_seats--;
    return NULL;	
    }
    
    int main(){
    	int c;
    pthread_t tids[CAPACITY];	//Array of Threads
    
    //Create a number of threads
    for (c=0;c<CAPACITY;c++){
    pthread_create(&tids[c],NULL,visitRestaurant,NULL);
    sleep(rand()%5);
    }
    
    //Wait for every thread
    for (c=0;c<CAPACITY;c++){
    pthread_join(tids[c],NULL);
    }
    //used seats shoult be 0 after execution of all threads
    printf("Total: %d",used_seats);
    return 0;	
    }
    

    lg der threadbeginner
    P.S.:Synchronisation werd ich noch später vornehmen,:



  • pthread_self ist eine Funktion, also fehlern dahinter die Klammern 😉

    Und synchronisation wäre wirklich sinnvoll :p



  • Hallo,

    Also, erstmal, klar Du musst schon die Funktion pthread_self() nehmen, dann aber auf unsigned casten (printf braucht dafuer %lu - danke legalopex 😉 )

    Imo solltest Du irgendwie versuchen zu synchronizieren, allein schon aus stilistischen Gruenden, oder zumindest darueber nachdenken ob Du eine Synchronisation brauchst oder nicht - obwohl, das setzen eines ints als atomar gilt (meine Frage diesbezueglich ist auch immer noch offen!).

    Wenn Du hier rand() nimmst bekommst Du zusaetzlich noch zwei Probleme:
    1. rand() ist laut manpage nicht threadsafe
    2. rand() liefert Dir immer die gleiche Zahlenfolge, ich habe es deshalb in rand_r() abgeaendert und beim linker dafuer das Flag -D _XOPEN_SOURCE zusaetzlich gesetzt (-lm -pthread solltest Du ja eh schon im Makefile stehen haben).

    Ein weiteres Problem glaube ich gesehn zu haben und zwar gibst Du die Nummer der belegten Sitzplaetze als Gast Id aus. Naja, ich habe das mal geaendert und dem jeweiligen Thread seine Nummer mitgegeben, wenn das nicht gewuenscht sein sollte, kannst'es ja wieder rausloeschen.

    Zur Synchronisation habe ich es jetz mal so versucht mit einem Mutex: Initialisierung standardmaessig per Macro, dann verwendung mit trylock, weil wir ja mehrere Threads haben die um die Ressource konkurrieren, solange trylock nicht 0 returnt wird gepollt. Nja, wie gesagt ne int Operation, ich denke, das muesste auch ohne syncen funktionieren, theoretisch.

    #include <stdlib.h>
    #include <stdio.h>
    #include <pthread.h>
    #include <unistd.h>
    
    #define CAPACITY 10
    #define EMPTY 0
    
    extern int rand_r(unsigned int*);
    
    int used_seats=0;
    pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
    
    /*Method for visit.
     * A customer comes in, waits some (random) time and leaves
     */
    void* visitRestaurant (void *arg){
      int customer_id = (int) arg;
      unsigned int seed = (unsigned int) customer_id;
      ++customer_id; // starting the numbers with 1 ;-)
      while(pthread_mutex_trylock(&lock));
      used_seats++;
      pthread_mutex_unlock(&lock);
      printf("Customer %d (Thread %lu) -- Entering Restaurant\n", customer_id,(unsigned long) pthread_self());
      sleep(rand_r(&seed)%10);
      printf("Customer %d (Thread %lu) -- Leaving Resaturant\n", customer_id,(unsigned long) pthread_self());
      while(pthread_mutex_trylock(&lock));
      used_seats--;
      pthread_mutex_unlock(&lock);
      return NULL;   
    }
    
    int main(){
      int c;
      pthread_t tids[CAPACITY];    //Array of Threads
    
      //Create a number of threads
      for (c=0; c<CAPACITY; c++){
        pthread_create(&tids[c],NULL,visitRestaurant,(void*)c);
        sleep(rand()%5);
      }
    
      //Wait for every thread
      for (c=0;c<CAPACITY;c++){
        pthread_join(tids[c],NULL);
      }
      //used seats shoult be 0 after execution of all threads
      printf("Total: %d\n",used_seats);
      return 0;   
    }
    

Anmelden zum Antworten