threads



  • hallo

    ich bekomme folgende fehler meldung.

    gmake all-recursive
    gmake[1]: Wechsel in das Verzeichnis »/home/stefan/readerwriterproblem«
    Making all in readerwriterproblem
    gmake[2]: Wechsel in das Verzeichnis »/home/stefan/readerwriterproblem/readerwriterproblem«
    /bin/sh ../libtool --silent --mode=link --tag=CXX g++ -Wnon-virtual-dtor -Wno-long-long -Wbad-function-cast -Wundef -Wall -pedantic -W -Wpointer-arith -Wmissing-prototypes -Wwrite-strings -ansi -D_XOPEN_SOURCE=500 -D_BSD_SOURCE -Wcast-align -Wconversion -O2 -O0 -g3 -Wall -fno-exceptions -fno-check-new -o readerwriterproblem main.o
    main.o: In function Reader(void*)': /home/stefan/readerwriterproblem/readerwriterproblem/main.cpp:21: undefined reference tosem_wait'
    /home/stefan/readerwriterproblem/readerwriterproblem/main.cpp:24: undefined reference to sem_wait' /home/stefan/readerwriterproblem/readerwriterproblem/main.cpp:26: undefined reference tosem_post'
    /home/stefan/readerwriterproblem/readerwriterproblem/main.cpp:30: undefined reference to sem_post' main.o: In functionWriter(void*)':
    /home/stefan/readerwriterproblem/readerwriterproblem/main.cpp:37: undefined reference to sem_wait' /home/stefan/readerwriterproblem/readerwriterproblem/main.cpp:39: undefined reference tosem_post'
    main.o: In function initSemaphores()': /home/stefan/readerwriterproblem/readerwriterproblem/main.cpp:44: undefined reference tosem_init'
    /home/stefan/readerwriterproblem/readerwriterproblem/main.cpp:45: undefined reference to sem_init' main.o: In functiondestroySemaphores()':
    /home/stefan/readerwriterproblem/readerwriterproblem/main.cpp:49: undefined reference to sem_destroy' /home/stefan/readerwriterproblem/readerwriterproblem/main.cpp:50: undefined reference tosem_destroy'
    collect2: ld returned 1 exit status
    gmake[2]: Verlassen des Verzeichnisses »/home/stefan/readerwriterproblem/readerwriterproblem«
    gmake[2]: *** [readerwriterproblem] Fehler 1
    gmake[1]: Verlassen des Verzeichnisses »/home/stefan/readerwriterproblem«
    gmake[1]: *** [all-recursive] Fehler 1
    gmake: *** [all] Fehler 2
    *** fehlgeschlagen ***

    hier ist der code

    #include <pthread.h>
    #include <semaphore.h>
    #include <iostream>
    #include <math.h>
    #include <unistd.h>
    using namespace std;
    
    const int numOfReader = 4;
    const int numOfWriter = 1;
    int rc = 0;
    
    sem_t dataBase;
    sem_t mutex;
    
    void* Reader(void *arg);
    void* Writer(void *arg);
    
    void* Reader(void *arg){
    
        while(true){
            sem_wait(&mutex);
            ++rc;
            if(rc == 1){
                sem_wait(&dataBase);
            }
            sem_post(&mutex);
    
            cout<<"Reader " << getpid() <<"liest aus der Datenbank" << endl;
    
            sem_post(&dataBase);
        }
    }
    
    void* Writer(void *arg){
            while(true){
                sem_wait(&dataBase);
                cout<<"Writer" << getpid() << "Schreibt in die Datenbank" << endl;
                sem_post(&dataBase);
            }
        }
    
    void initSemaphores(){
        sem_init(&dataBase,0,1);
        sem_init(&mutex,0,1);
    }
    
    void destroySemaphores(){
        sem_destroy(&dataBase);
        sem_destroy(&mutex);
    }
    
    void startThreds(){
        pthread_t id[numOfWriter + numOfReader];
        int pthread_return = 0;
        for(int i=0;i<numOfReader;++i){
            pthread_return = pthread_create(&id[i],0,Reader,0);
        }
    
        for(int i=0;i<numOfWriter;++i){
            pthread_return = pthread_create(&id[numOfReader+i],0,Writer,0);
        }
    }
    
    int main(){
        initSemaphores();
        startThreds();
        destroySemaphores();
        return 0;
    
    }
    

    und wie kann ich das programm eine zeitlang anhalten.
    also unter windows würde ich es mit sleep machen.

    danke für eure hilfe.



  • void* Reader(void arg);
    void
    Writer(void *arg);

    Warum void***** ? 😕



  • Original erstellt von stef:
    und wie kann ich das programm eine zeitlang anhalten.
    also unter windows würde ich es mit sleep machen.

    Unter Linux macht man das auch mit "sleep()" oder "usleep()" oder "nanosleep()" 😉
    Schau' doch mal in die entsprechenden man-Pages.


Anmelden zum Antworten