Threads einschläfern und aufwecken.



  • Hallo,
    ich möchte gern einen Ringbuffer schreiben, der von einem (POSIX) Thread gelesen und von einem anderen beschrieben werden kann. Sollte jetzt der Lesethread zu langsam sein, so dass nicht genug Platz im Speicher übrig ist, möchte ich, dass der Schreibthread so lange eingeschläfert wird, bis der Lesethread sich Daten abgeholt hat.

    Wie kann ich also einen Thread einschläfern und ihn von einem anderen Thread wieder aufwecken?



  • Das macht man mit Condition Variablen. Dein Problem ist in fast jedem Tutorial als Beispiel zu Condition Variablen aufgeführt. Hier mal die Kernfunktionen im C Stil:

    void insert(void * work) {
      pthread_mutex_lock(&mutex);
      while (size == BUFFERSIZE) {
        pthread_cond_wait(&not_full_cond, &mutex);
      }
      buffer[(last + size) % BUFFERSIZE] = work;
      ++size;
      pthread_cond_broadcast(&not_empty_cond);
      pthread_mutex_unlock(&mutex);
    }
    
    void * remove(void * work) {
      pthread_mutex_lock(&mutex);
    
      while (size == 0) {
        pthread_cond_wait(&not_empty_cond, &mutex);
      }
    
      void * ret = buffer[last];
      size -= 1;
      last = (last + 1) % BUFFERSIZE;
      pthread_cond_broadcast(&not_full_cond);
    
      pthread_mutex_unlock(&mutex);
      return ret;
    }
    


  • Vielen Dank! Damit sollte ich was anfangen können. Danke! 🙂



  • Threads sind seltene Tiere und dürfen nicht ohne Genehmigung eingeschläfert werden. ⚠



  • Tierschützer schrieb:

    Threads sind seltene Tiere und dürfen nicht ohne Genehmigung eingeschläfert werden. ⚠

    Ich bin gerade dabei, deren Population zu vergrößern. Ich darf das!!!


Anmelden zum Antworten