Korrektes Locking pthreads



  • Hi,

    ich lese mich gerade in pthreads ein, doch das Locking ist mir noch nicht so ganz klar. Ich habe folgende Codeschnipsel:

    // global
    int exit = 0;
    char input;
    
    int main() {
      initGame();
    
      pthread_t new_thread;
    
      pthread_create(new_thread, NULL, getInput, NULL);
      char cpy;
    
      while(!exit) {
        cpy = input;
        input = '\0';
        if(copy == 'x')
          doSomething();
        if(copy == 'e')
          exit = 1;
    
        doOtherStuff();
      }
    
      return 0;
    }
    
    void *getInput(void *void_ptr) {
      while(!exit) {
        input = getchar();
      }
      pthread_exit(NULL);
    }
    

    Ich hab mir gedacht, dass ich den Kopiervorgang locke:

    pthread_mutex_lock(&mutex);
    cpy = input;
    input = '\0';
    pthread_mutex_unlock(&mutex);
    

    In getInput verändere ich aber auch den Wert von input und mir ist nicht klar, wie ich dort locken soll. So?

    void *getInput(void *void_ptr) {
      char ch;
      while(!exit) {
        ch = getchar();
        pthread_mutex_lock(&mutex);
        input = ch;
        pthread_mutex_unlock(&mutex);
      }
      pthread_exit(NULL);
    }
    

    Besser wäre es, wenn nicht beide Threads den Wert von input verändern würden, aber mir fällt keine alternative Lösung ein. Der neue Thread dient nur dem Einlesen der Benutzereingaben, die Befehle darstellen.

    LG


  • Mod

    Wie wäre es mit

    int main() {
      int input;
      while((input = getchar()) != EOF) {
        if(input == 'x')
        {
          // erzeuge neuen thread für doSomething();
        }
      }
      return 0;
    }
    

    ?

    Besser wäre es, wenn nicht beide Threads den Wert von input verändern würden, aber mir fällt keine alternative Lösung ein.

    Dafür sind doch gerade Locks da. Irgendwie müssen die Threads schließlich miteinander reden, wenn sie Informationen austauschen sollen.


Log in to reply