2017-07-23 1 views
0

Gibt es eine Möglichkeit festzustellen, ob eine Funktion oder ein Thread blockiert? Ich möchte einen Testfall erstellen, in dem ich testen kann, ob eine Funktion hard-realtime-sicher ist.Locklessness testen C++

+2

Es scheint, dass Sie versuchen, das Halteproblem zu lösen (https://en.wikipedia.org/wiki/Halting_problem). Ich kann dir damit helfen. Zuerst einfach –

Antwort

0

Nein. Es gibt keine allgemeine Möglichkeit, dies zu tun.

Es gibt viele Möglichkeiten, wie ein Spin-Lock- und ähnliche "Try-Fail-Retry" -Algorithmen zu "blockieren", dass es keinen realistischen Weg gibt zu instrumentieren, welcher Code "blockiert".

Betrachten Sie etwas wie eine sequentielle Sperre. Das ist eine Sperre, die niemals einen (einzelnen) Schreiber blockiert, sondern Leser dazu veranlasst, erneut zu versuchen, wenn sie während eines Schreibvorgangs gelesen haben (und daher möglicherweise einen beschädigten Wert gelesen haben).

Es skaliert in Lesern sehr gut, besonders wenn Schreibvorgänge relativ selten sind. Sicherlich ist der wichtige Punkt, dass Leser sich nicht gegenseitig blockieren, so dass die Verzögerung beim Lesen ein fester Wert ist, wenn die Leser skalieren.

Es ist strittig, ob es technisch sicher und sicher unmöglich ist, ein Werkzeug zu schreiben, um den Algorithmus zu analysieren und festzustellen, ob es frei von Sperren ist oder zu welchem ​​Zeitpunkt es (logisch) blockiert.

0

Nein, das ist nicht möglich. Betrachten Sie diese Funktion:

unsigned compute(unsigned x) 
{ 
    while (x < 10) { 
     if (x) { 
      x++; 
     } 
    } 
    return x; 
} 

Es wird in begrenzten Zeit laufen, es wäre denn, x Null in diesem Fall ist es unendlich Zeit in Anspruch nehmen wird.

Sie können nicht feststellen, ob solche Funktionen in Ihrem Programm vorhanden sind, aufgrund der Halting Problem.

Wenn Sie müssen nur entscheiden, ob Ihr Programm bestimmte Systemfunktionen aufruft, die Sie, wie Netzwerk festgestellt haben, zu blockieren I/O, die Sie tun können, dass durch Einfügen (über LD_PRELOAD, -fwrap oder ähnliche Verknüpfung Tricks) Wrapper-Funktionen um diese eingeschränkten Systemfunktionen. Zum Beispiel könnten Sie einen Wrapper für recv() schreiben, der überprüft, dass der Dateideskriptor nicht blockierend ist, und andernfalls EINVAL zurückgibt.

Beachten Sie, dass Festplatten-E/A auf vielen Systemen grundsätzlich eine Blockierungsoperation ist, daher müssen Sie diese vollständig deaktivieren.