2011-01-05 3 views
1

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

4

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.

+0

Dies scheint sinnvoll zu sein, aber ich konnte keine Dokumentation finden, die das Standard-Scheduling-Verhalten für PThreads beschreibt. – Ravi

+0

Ich fand dies eine interessante Lektüre: http://www.icir.org/gregor/tools/pthread-scheduling.html – cubic1271

+0

Danke, das ist hilfreich. – Ravi

0

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.

+0

Mein Dateideskriptor wird nicht geteilt, er ist spezifisch für einen Thread. Wenn der Thread lange dauert, wird er geplant? – Ravi

+0

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

+0

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

2

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.

1

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.

Verwandte Themen