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 argumentpthread_cleanup_push
ist der Typvoid(*)(void*)
, nichtint(*)(pthread_mutex_t*)
. Sie müssen eine wrapper-Funktion, von der richtigen Art, die ruftpthread_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)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sieht es aus wie Sie den code, um die push -
pthread_mutex_unlock
Funktion auf den thread cleanup-stack überpthread_cleanup_push
macht das code-snippet, da sonst die Gewinde greifen würde die shared-Sperre und gezwungen werden, zu beenden, ohne es loszulassen.Durch drücken der
pthread_mutex_unlock
Funktion auf den cleanup stack, der thread ist sicherzustellen, dass die mutex bekommen wird freigeschaltet, wenn der thread beendet wird, auch wenn das beenden erzwungen wird und derpthread_cleanup_pop
- Funktion ist nicht der hit.Im wesentlichen die Bereinigung queue gibt Ihnen die Fähigkeit, dafür zu sorgen-code wird ausgeführt /Ressourcen werden freigegeben /etc auf die Ausfahrt. Die
pthread_cleanup_pop function
ruft einfach nur die top-Funktion auf den cleanup stack, beim beenden von anrufen alle Funktionen auf dem cleanup stack. Siehe der Mann vonpthread_cleaup_push
für mehr info.