2017-01-31 5 views
1

Ich habe eine std::istream mit zu arbeiten. Ist es möglich, sie an mehrere Leser weiterzuleiten, die möglicherweise von verschiedenen Positionen aus suchen und lesen?Ist es möglich, einen istream auf mehrere Leser zu verteilen?

Wenn nicht, was passiert, wenn ich es auf den Fall einer std::ifstream beschränken?

+0

Ich denke Streams sind nicht kopierbar. Die Idee, dasselbe Stream-Objekt zu übergeben, ist nicht durchführbar. – Steephen

+0

Ich weiß nicht, ob range-v3 mit solchen Funktionen ausgestattet ist, aber ich kann mir vorstellen, dass es nicht zu schade wäre, eine sinnvolle Bereichsfunktion für einen 'InputRange' zu ​​schreiben. Wenn nichts anderes, looping den Eingang träge und eine Reihe von Ausgabekopien ([1,2,3] -> [[1,2,3], [1,2,3], [1,2,3] ]), mit der durch einen Parameter bestimmten Anzahl. Leider ist eine solche einfache Lösung möglicherweise nicht gut für das Suchen. – chris

+1

Wenn Sie von mehreren Orten auf demselben 'std :: istream 'suchen, werden die anderen Suchvorgänge überschrieben. Wenn es sich um eine Datei handelt, könnten Sie möglicherweise mehrere 'std :: ifstream's für dieselbe Datei öffnen und nach verschiedenen Orten suchen; Das Betriebssystem kann den Zugriff für Sie optimieren. – vu1p3n0x

Antwort

-1

Sie haben Ihre Frage bereits beantwortet. Wenn es filestream (ifstream) ist, erhalten Sie wahlfreien Zugriff (nur lesen; Sie können den offenen Modus einstellen), sollte es kein Problem mit mehreren Threads Zugriff auf die gleiche Datei durch Öffnen von mehreren ifstreams jeweils für einen Thread. Der C++ - Standard sagt nichts über Thread-Sicherheit über ifstream aus. Wenn Sie die Methode get() für den generischen istream (socket, cin) verwenden, verbrauchen Sie einen Eingabestream. Ich sehe kein Dokument für Thread-Safe von iStream. Die Methode peek() wird den Eingabestream nicht konsumieren, aber den internen Status des iStreams ändern. Wenn mehrere Threads in demselben Stream seek() ausführen, ist das Verhalten nicht definiert. Sie sind nicht von einer internen Sperre durch die C++ - Sprache überzeugt. Die seek() imitiert im Wesentlichen eine Art Zeiger auf einen internen Puffer.

Ich würde vorschlagen, dass Sie einen Thread haben, der den istream in einen Puffer liest (konstruierte Objekte (der Produzent) oder einfacher roher Speicher), dann können mehrere Threads das Ergebnis (Consumer) konsumieren. Dies ist eine typische Synchronisation zwischen Konsumenten und Produzenten; Jedes Multithreading-Lehrbuch wird Ihnen zeigen, wie es geht.

+0

Die verschiedenen Threads stören sich gegenseitig, wenn sie suchen, unabhängig vom Streamtyp. 'fstream' ist keine Ausnahme. – MSalters

+0

Dann sollte die Lösung Single-Thread lesen, mehrere Threads verbrauchen, das typische Consumer/Producer-Modell, das Sie um den iStream wickeln müssen. –

Verwandte Themen