2016-07-09 12 views
0

Ich entwickle eine Thread-sichere Klasse, die auch Fehler behandeln. Ich habe mich gefragt, wie man mit einem möglichen Fehler umgehen soll, der von der Funktion pthread_mutex_unlock() kommt. Wenn ich den Mutex werfe ist der immer noch gesperrt? Sollte ich versuchen, es wieder zu entsperren oder das Klassenobjekt zu zerstören?Wie behandelt man einen pthread_mutex_unlock() Fehler?

int SomeClass::function() { 
    int res = pthread_mutex_lock(&_mutex); 
    if(res < 0) 
     throw std::runtime_error("lock failed: " + std::string(std::strerror(res))); 
    // some code 
    res = pthread_mutex_unlock(&_mutex); 
    if(res < 0) 
     throw std::runtime_error("unlock failed: " + std::string(std::strerror(res))); 
    return something; 
} 

Vielen Dank!

EDIT:

die vaiable _mutex ist eine geschützte Klasse Mitglied (nicht statisch) innerhalb des Konstruktors nur pthread_mutex_init(&_mutex, NULL)

+0

Welche Art von Mutex ist das? Ich nehme an, dass es zu 'SomeClass' gehört und nicht global ist. Wird es in mehreren Instanzen von 'SomeClass' geteilt? Antworten auf diese Fragen zeigen: A) Welche Fehler können auftreten und B) Wie groß ist das Risiko, das Objekt zu zerstören. Haben Sie 'pthread_mutex_tryclock()' in Betracht gezogen? –

+0

Siehe Teil bearbeiten. Ich denke, wenn ich 'pthread_mutex_trylock()' verwende, muss ich auch 'pthread_mutex_unlock()' verwenden, also weiß nicht, wie das helfen könnte. – lcit

+0

Ich glaube, der einzige Fehler von unlock() ist das Aufrufen, wenn Sie die Sperre nicht besitzen. Dies wäre ein logischer Fehler in Ihrem Code. Also loggen und werfen. Tipp: Wenn Ihr Compiler dies unterstützt ... fügen Sie Ihrer Ausnahmemeldung \ _ \ _ FILE__ oder \ _ \ _ FILENAME__ oder "Compiler-abhängige Methode des Namens der Übersetzungseinheit" hinzu. Wenn Sie ein Überflieger sind, achten Sie auch auf den Zeilennummernmechanismus. –

Antwort

3

Der einzige Fall mit initialisiert, wenn pthread_mutex_unlock definitiv ausfallen können, wenn Mutex entriegelt wird nicht ist Ein gültiger Mutex oder Mutex gehört nicht zu deinem Thread. Wenn beides nicht der Fall ist, sollten Sie sich keine Sorgen machen, und beide Bedingungen sind ein Anwendungsfehler - an dieser Stelle können Sie eine Ausnahme auslösen und sich nicht um den Mutex-Status kümmern, Sie haben größere Probleme.