Ist es notwendig, pthread_mutex_destroy auf einem Mutex aufzurufen?

8

Ich verwende pthread_mutex_t in einem C ++ - Programm wie folgt:

%Vor%

(Die Klasse ist nicht kopierbar - Ссылка )

Was ich nicht verstehe - ist es ein Fehler zu nicht Aufruf pthread_mutex_destroy im Destruktor? Die Dokumentation, die ich gelesen habe, besagt nicht, dass die Zerstörung aufgerufen werden muss.

Weiß jemand, was pthread_mutex_destroy tatsächlich macht und unter welchen Bedingungen ist es erforderlich?

BEARBEITEN

Gilt die Antwort für pthread_mutex_destroy auch für pthread_cond_destroy usw.? Sie scheinen fast wie nutzlose Funktionen für mich, es sei denn pthread_mutex_init et. al. Speicher reservieren? (Die Dokumente sind mir nicht ganz klar.)

Es tut mir nicht weh, trotzdem zu zerstören, also ist die Frage weitgehend akademisch.

Auf Linux sowieso scheint es, zerstören nur setzt den Mutex in einen ungültigen Zustand:

%Vor%

(Von glibc-2.14 / nptl / pthread_mutex_destroy.c).

    
Wayne Uroda 06.02.2013, 03:55
quelle

2 Antworten

12

Wenn Ihnen jemand eine Zerstörungsfunktion zur Verfügung stellt, müssen Sie sie als letzte Aktion für dieses Objekt aufrufen, bevor es den Gültigkeitsbereich verlässt.

Auf Architekturen und Implementierungen, bei denen die API keine Auswirkungen hat, wird dies wegoptimiert. Wenn sich die API in Zukunft jedoch dahingehend ändert, dass der interne Status bereinigt werden muss und Ihr Code sie nicht aufruft, verfügt Ihr Code nun über einen Speicher und / oder Ressourcenverlust.

Also ist die einfache Antwort ja; Sie müssen diese API aufrufen - und hier ist die Sache - , auch wenn die API im Moment nichts tut , obwohl die API selbst für immer in die Zukunft fixiert ist, ist die Implementierung hinter der API nicht.

    
SecurityMatt 06.02.2013, 04:00
quelle
5

Aus der IEEE-Dokumentation , die der POSIX-Standard ist:

  

Die Funktion pthread_mutex_destroy () soll das von mutex referenzierte Mutex-Objekt zerstören; Das Mutex-Objekt wird tatsächlich nicht initialisiert. Eine Implementierung kann dazu führen, dass pthread_mutex_destroy () das von mutex referenzierte Objekt auf einen ungültigen Wert setzt. Ein zerstörtes Mutex-Objekt kann mit pthread_mutex_init () neu initialisiert werden; Die Ergebnisse der anderweitigen Verweise auf das Objekt, nachdem es zerstört wurde, sind nicht definiert.

Die Dokumentation sagt nicht, dass Sie es aufrufen müssen. Aber es ist eine gute Übung, dies zu tun.
Der Aufruf dieser API signalisiert der POSIX-Bibliothek, alle Ressourcen freizugeben, die während der Initialisierung für dieses bestimmte Mutex-Objekt reserviert waren.
Es ist logisch anzunehmen, dass die Mutex-Initialisierung einige Ressourcen zuweist / reserviert.

    
Alok Save 06.02.2013 04:02
quelle

Tags und Links