Ich benutze Pthreads unter Linux, und einer meiner Threads ruft regelmäßig die Schreibfunktion auf einem Gerätedateideskriptor. Wenn der Schreibaufruf eine Weile dauert, bis er beendet ist, wird mein Thread gesperrt, so dass andere Threads ausgeführt werden können? Ich habe keine der Planungsfunktionen von PThreads eingestellt, daher ist meine Frage das Standard-Thread-Verhalten.Frage zum Blockieren von I/O in einem Thread
Antwort
Solange nichts anderes versucht, auf dieselbe Ressource zu schreiben, sollten die anderen Threads ausgeführt werden, während der schreibende Thread auf seinen Schreibvorgang wartet.
Wenn Ihr Gerätedateideskriptor eine freigegebene Ressource ist, müssen Sie auf die Sperrung achten. Aber sobald es threadsicher ist, werden Aufrufe an eine solche gemeinsam genutzte Ressource serialisiert. Wenn also ein Thread schreibt, wird der Rest blockiert. Wenn das Sperren nicht implementiert ist, können die Daten verstümmelt sein.
Mein Dateideskriptor wird nicht geteilt, er ist spezifisch für einen Thread. Wenn der Thread lange dauert, wird er geplant? – Ravi
Wenn jeder Thread über einen eigenen Dateideskriptor verfügt, gibt es keine Konflikte, daher gibt es keinen Grund, andere Threads zu blockieren. Wie auch immer Ihre Frage besagt, dass es einen Dateideskriptor gibt und dass es mehrere Threads gibt, so nahm ich an, dass der Dateideskriptor geteilt wurde. – Schultz9999
Es ist keine Frage über die Konkurrenz. Die Frage ist, ob ein Thread lange dauert, um einen Schreibvorgang in einen Dateideskriptor abzuschließen. Wie werden andere Threads eingeplant? – Ravi
Wenn ein write()
Aufruf blockiert, wird nur der aufrufende Thread ausgesetzt. Dies ist in der POSIX spec for write()
dokumentiert:
Wenn es genug Platz für alle Daten angefordert sofort geschrieben werden, die Umsetzung sollte so tun. Andernfalls kann der aufrufende Thread blockieren; das heißt, pausieren, bis genug Platz zum Schreiben zur Verfügung steht.
Beachten Sie, dass es Faden, nicht Aufruf Prozess sagt Aufruf.
Sehen Sie, wenn Behaviour Blocking explizit definiert ist http://www.akkadia.org/drepper/nptl-design.pdf
Im Prinzip ja, können andere Threads laufen.
Beachten Sie jedoch, dass einige Dateisysteme über Sperrmechanismen verfügen, die nur eine gleichzeitige E/A-Operation für eine einzige Datei zulassen. Wenn also ein anderer Thread eine andere IO in der gleichen Datei ausführt (auch wenn sie über einen anderen Dateideskriptor läuft), kann sie dies für einen Teil der Dauer des Systemaufrufs write() blockieren.
Es gibt auch andere In-Kernel-Sperren für andere Einrichtungen. Die meisten von ihnen blockieren jedoch nicht, dass andere Threads ausgeführt werden, es sei denn, sie führen eng verwandte Aktivitäten durch.
- 1. Java-Thread blockieren
- 2. Callback blockieren den Thread
- 3. [Scala]: Problem mit Schauspielern und Blockieren von IO
- 4. Haskell IO Bool fold Frage
- 5. sehr einfach io Frage C++
- 6. Kann glGetError einen Thread blockieren?
- 7. Entity Framework Async Anruf blockieren UI-Thread
- 8. Newbie Thread Frage (FFTW)
- 9. Blockieren von IO gegenüber nicht blockierenden IO; Auf der Suche nach guten Artikeln
- 10. Blockieren von Threads
- 11. Toten Einfache Java IO & Enum Frage
- 12. richtigen Weg zum Erstellen von Thread in ASP.NET-Webanwendung
- 13. Blockieren von Diktaten in Python?
- 14. Frage zum NULL-Pointer Zuordnung Partition in einem Prozess Adressraum
- 15. MACRO-Erweiterung zum Blockieren von Präprozessoren
- 16. CodeIgniter Exportieren von Aufgaben zum Blockieren der Navigation
- 17. Auflösen von CollectionView-Rendering zum Blockieren des UI-Threads
- 18. Androider Thread und Klassenverhalten Frage
- 19. macht AnimateWithDuration: Animationen: Haupt-Thread blockieren?
- 20. Verwenden von async zum Schlafen in einem Thread ohne Einfrieren
- 21. Frage zum Rendern von HTML
- 22. Frage zum Funktionsreferenz und Themen
- 23. Lazy Loading UImages von Dateien ohne Haupt-Thread zu blockieren?
- 24. Frage zum Levenshtein
- 25. Was blockiert in einfachen Worten IO und nicht-blockierende IO?
- 26. Frage zum Kopieren von Eigenschaften in ViewModels
- 27. Frage zum Einfügen von Assemblercode in C++
- 28. Kann Android Hintergrund Thread von außerhalb der Anwendung blockieren?
- 29. Java Wait-For-Thread Frage
- 30. Eine Liste von IO Float zusammenfassen: [IO Float] in Haskell
Dies scheint sinnvoll zu sein, aber ich konnte keine Dokumentation finden, die das Standard-Scheduling-Verhalten für PThreads beschreibt. – Ravi
Ich fand dies eine interessante Lektüre: http://www.icir.org/gregor/tools/pthread-scheduling.html – cubic1271
Danke, das ist hilfreich. – Ravi