PThread - Schreiber-Leser-Problem
-
Hallo zusammen...
habe ein kleines problem mit den pthreads, soll das Schreiber-Leser-Problem
programmieren, also es gibt mehrere Leser und mehrere Schreiber die auf eine
Datenbank zugreifen wollen. Schreiber können nur zugreifen wenn keine Leser in
der Datenbank sind und Leser dürfen nicht auf die Datenbank zugreifen wenn
sich ein Schreiber in der Datenbank befindet, es dürfen mehrere Leser
gleichzeitig auf die Datenbank zugreifen.So weit hab ich es auch geschafft, aber nun sollen wir das Program so verändern
das die Schreiber eine größere Chance haben zugriff auf die Datenbank zu bekommen.Hab mir das so überlegt:
Sobald ein Schreiber in die Datnbank will, wird das registriert und es werden
keine weiteren Leser mehr in die Datenbank gelassen. Alle Leser die im Moment
noch drinne sind dürfen noch fertig lesen und dann kommt der Schreiber dran.Ich schaff es aber leider nicht das umzusetzen, hab zu vor noch nie mit
Threads gearbeitet und habe noch nicht so den Durchblick, aber leider habe
ich im Moment auch keine Zeit mich stundenlang damit zu beschäftigen, da ich
noch viele andere Dinge fertig bekommen muss und nächste Woche die
Klausurenphase anfängt, für die ich auch noch ein bißchen lernen muss.Wäre toll wenn mir einer erklären könnte was ich an meiner Version ändern
muss das es so funktioniert wie oben beschrieben.Hier mein Prog:
#include <iostream> #include <pthread.h> #include <semaphore.h> using namespace std; #define NUMREADERS 5 #define NUMWRITERS 2 sem_t mutex; sem_t db; int Readers = 0; void* read(void* id){ while(true){ sem_wait(&mutex); Readers++; if(Readers == 1){ sem_wait(&db); } cout<<"<- "<<int(id)+1<<". liest in Datenbank"<<endl; sem_post(&mutex); sem_wait(&mutex); Readers--; if(Readers == 0){ sem_post(&db); } sem_post(&mutex); } } void* write(void* id){ while(true){ sem_wait(&db); cout<<"-> "<<int(id)+1<<". schreibt in Datenbank"<<endl; sem_post(&db); } } int main(void){ sem_init(&mutex,0,1); sem_init(&db,0,1); pthread_t readers[NUMREADERS]; pthread_t writers[NUMWRITERS]; //create Reader-Threads for(int i=0;i<NUMREADERS;++i){ if(pthread_create(&readers[i],NULL,read,(void*)i)){ exit(-1); } } //create Writer-Threads for(int i=0;i<NUMWRITERS;++i){ if(pthread_create(&writers[i],NULL,write,(void*)i)){ exit(-1); } } //join Reader-Treads for(int i=0;i<NUMREADERS;++i){ if(pthread_join(readers[i],NULL)){ exit(-1); } } //join Writer-Treads for(int i=0;i<NUMWRITERS;++i){ if(pthread_join(writers[i],NULL)){ exit(-1); } } pthread_exit(NULL); return 0; }
Hoffe mir kann irgendeiner von euch weiter helfen!!!
mfg smilingman.
-
Eine Lösung wirst du im "The Little Book of Semaphores" finden: