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?
Vielleicht Linux! = Unix? Außerdem scheint es eine vernünftige Verbesserung zu sein, um zu verhindern, dass sich ein Thread selbst blockiert. –
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); –