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:

    http://www.greenteapress.com/semaphores/


Anmelden zum Antworten