F
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;
}