2017-05-16 1 views
0

Ich las über Advanced Programming in Unix-Umgebung 3. 11.6.2 Verklemmungsvermeidung:Warum wird ein Thread-Deadlock nicht funktionieren, wenn er versucht, den gleichen Mutex zweimal unter Linux zu sperren?

Ein Thread wird sich Deadlock, wenn sie die gleiche Mutex zweimal

Um dies zu überprüfen, zu sperren versucht, ich schreibe eine Demo:

pthread_mutex_t mutex; 
int main() { 
    pthread_mutex_init(&mutex, NULL); 
    pthread_mutex_lock(&mutex); 
    printf("lock 1\n"); 
    pthread_mutex_lock(&mutex); 
    printf("lock 2\n"); 
    pthread_mutex_unlock(&mutex); 
    printf("unlock 1\n"); 
    pthread_mutex_unlock(&mutex); 
    printf("unlock 2\n"); 
    pthread_mutex_destroy(&mutex); 
    return 0; 
} 

Haupt-Thread nicht blockiert hat, und der Ausgang ist:

sperren 1

Schloss 2

Unlock 1

Unlock 2

Warum ist es so?

+0

Vielleicht Linux! = Unix? Außerdem scheint es eine vernünftige Verbesserung zu sein, um zu verhindern, dass sich ein Thread selbst blockiert. –

+1

Als Nebenbemerkung unterstützt Pthreads einen * rekursiven Mutex *, der dasselbe wie ein regulärer Mutex ist, außer dass er Logik und einen Zähler enthält, so dass ein Thread ihn mehr als einmal ohne Deadlock sperren kann (der Thread muss sich daran erinnern) entsperren Sie es so oft wie es es gesperrt hat, obwohl). Um einen Pthread-Mutex rekursiv zu machen: pthread_mutexattr_t mutexattr; pthread_mutexattr_init (& mutexattr); pthread_mutexattr_settype (& mutexattr, PTHREAD_MUTEX_RECURSIVE); pthread_mutex_init (& _ locker, & mutexattr); –

Antwort

1

Wie kompilieren Sie das? Ich vermute, dass Sie die Option -pthread nicht an den Compiler übergeben haben und pthread-bezogene Dinge wie die oben genannten bleiben als Noops (d. H. Sie werden nicht eingezogen).

Getestet habe ich nur Ihre prog

cc -pthread meh.c

als

erstellt und das Ergebnis hängt schön nach "1 sperren".

+0

Du hast mich !!! Ich starte gcc -pthread myctest.c und dann ./a.out, es blockiert !!! – cong

Verwandte Themen