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++
Antwort
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.
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.
- 1. UDP lokal testen C#
- 2. Testen: Objective-C + Swift
- 3. Software zum testen C# code
- 4. C# Eine konstante Internetverbindung testen
- 5. So testen Sie C-Code
- 6. Testen der Datenbankkonnektivität in der C# -Konsolenanwendung
- 7. C# /. NET: Testen von BackgroundWorker mit NUnit
- 8. Datengetriebenes Testen in C# mit Arrays
- 9. Wie kann ich Leistungsoptimierungen in C testen?
- 10. Testen der Gleichheit von Arrays in C#
- 11. Einheit der C# Doppel-Lock-Muster testen
- 12. C# -Anwendung zum Testen des Mikrofons
- 13. Testen Sie Schnittstellen in C# private Methoden
- 14. Testen eines reinen C-Codes auf Xcode?
- 15. Testen einer Windows Form-Anwendung in C#
- 16. Testen eines Score-Bereichs in C#
- 17. Testen des SMTP-Servers läuft über C#
- 18. Verwenden Sie rspec, um C/C++ - Programm zu testen
- 19. Testen der Verfügbarkeit von x_np Pthread Funktionen - C/C++
- 20. Konfigurationsdatei testen
- 21. Automatisiertes Testen .NET (Gallio?)
- 22. Testen in der Konsole
- 23. Python - Verzeichnisberechtigungen testen
- 24. Was verwenden Sie, um C-Code zu testen?
- 25. Wie testen Sie eine C++ Bibliothek Benutzerfreundlichkeit in configure.in?
- 26. Testen auf Wertegleichheit zwischen zwei Schnittstelleninstanzen in C#?
- 27. Wie die Use Unit in Cmake in Sprache C testen?
- 28. C-Wortzahl-Programm schlägt beim Testen auf Leerzeichen fehl
- 29. So testen Sie eine Auto-Vervollständigen-Textbox mit Selen C#
- 30. Wie kann ich die Featureunterstützung mit C++ testen?
Es scheint, dass Sie versuchen, das Halteproblem zu lösen (https://en.wikipedia.org/wiki/Halting_problem). Ich kann dir damit helfen. Zuerst einfach –