Die sichere Löschung von pthreads mit einem cleanup-handler in C

Die wir gegeben haben, etwas code zu schauen, in Vorbereitung für eine Prüfung in Bezug auf pthreads und löscht Sie richtig. Wir haben darum gebeten worden zu erklären, was falsch ist, und korrigieren Sie es.

Meine Antwort: Die thread-handler-Funktion in einen wait-Zustand, ohne dass der mutex freigegeben wird, aber ich fühle mich wie ich bin etwas fehlt. Hier ist der code, die Zeilen hinzufügen einen sauberen handler Hinzugefügt wurden, bestimmen das Programm. Nochmal, ich bin mir nicht ganz sicher, WARUM dies funktioniert. (Ich verstehe das Konzept des clean-up-handler, aber ich verstehe nicht, warum es dieses spezielle problem behebt - ein weiterer Grund, warum ich nicht sicher bin, dass meine Antwort richtig ist)

#include <stdio.h>
#include <unistd.h>
#include <pthread.h>

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cv = PTHREAD_COND_INITIALIZER;
const int flag = 1;

static void * cancelme(void *bb_in)
{
  pthread_mutex_lock(&mutex);

  /* Install a cleanup handler */
  pthread_cleanup_push(pthread_mutex_unlock, &mutex);

  while (flag) {
    pthread_cond_wait(&cv, &mutex);
  }

  //before insertion of cleanup handlers: pthread_mutex_unlock(&mutex); was here

  /* Uninstall cleanup handler */
  pthread_cleanup_pop(1);



  return (NULL);
}

int main()
{
  pthread_t t;
  pthread_create(&t, NULL, cancelme, NULL);
  sleep(1);
  pthread_cancel(t);

  printf("Waiting for thread to finish...\n");
  pthread_join(t, NULL);
  printf("Thread finished...\n");

  printf("Waiting to acquire lock...\n");
  pthread_mutex_lock(&mutex);
  printf("Lock acquired\n");

  return (0);
}

Jedes feedback sehr geschätzt.

  • Ich bezweifle, das ist der Fehler Ihrer Lehrer sucht, aber pthread_cleanup_push(pthread_mutex_unlock, &mutex); ist ungültig. Das erste argument pthread_cleanup_push ist der Typ void(*)(void*), nicht int(*)(pthread_mutex_t*). Sie müssen eine wrapper-Funktion, von der richtigen Art, die ruft pthread_mutex_unlock, d.h. static void cleanup(void *p) { pthread_mutex_unlock(p); }
  • Vielen Dank dafür, aber was er wirklich sucht, ist der Grund, warum das Programm fällt vor dem pthread_cleanup_push und pthread_cleanup_pop wurden in den code, dh nach der while-Schleife die Zeile pthread_mutex_unlock(&mutex); War in den code (habe ich kommentiert, die in der eingefügten version oben)
InformationsquelleAutor Saf | 2012-08-13
Schreibe einen Kommentar