2017-01-31 41 views
1

我有一個std::istream可以使用。是否有可能以某種方式將它傳遞給多個可能尋求並從不同位置讀取的讀者?是否有可能向多個讀者分發流氓?

如果不是,如果我將其限制爲std::ifstream的情況怎麼辦?

+0

我認爲流不可複製。所以傳遞相同流對象的想法是不可行的。 – Steephen

+0

我不知道range-v3是否帶有這樣的功能,但是我認爲爲'InputRange'編寫一個很好的範圍函數並不算太壞。如果沒有別的,懶惰地循環輸入並返回一系列輸出副本([1,2,3] - > [[1,2,3],[1,2,3],[1,2,3] ]),數字由一個參數決定。不幸的是,這樣一個簡單的解決方案可能不適合尋求。 – chris

+1

從同一'std :: istream'上的多個地方尋找將覆蓋其他尋找。如果它是一個文件,你可能會爲同一個文件打開多個'std :: ifstream'並尋找不同的位置;操作系統可能爲您優化訪問。 – vu1p3n0x

回答

-1

您已經回答了您的問題。如果它是文件流(ifstream),你可以隨機訪問(只讀;你可以設置打開模式),多線程訪問同一個文件應該沒有問題,通過爲每個線程打開多個ifstream。 C++標準沒有提到ifstream的線程安全性。對於泛型istream(socket,cin),如果使用get()方法,則會消耗輸入流。我沒有看到任何有關istream線程安全的文檔。 peek()方法不會消耗輸入流,但仍會更改istream的內部狀態。如果多個線程在同一個istream上執行seek(),則行爲是未定義的。你不能保證C++語言的內部鎖定。 seek()基本上是取消引用某種指向內部緩衝區的指針。

我建議你有一個線程將istream讀入一些緩衝區(構造對象(生產者)或簡單的原始內存),然後,多個線程可以使用結果(消費者)。這是典型的消費者/生產者同步;任何多線程的教科書都會教你如何去做。

+0

不管線路類型如何,不同線程在尋找時都會相互干擾。 'fstream'也不例外。 – MSalters

+0

然後解決方案應該是單線程讀取,多線程消耗,您必須包裝istream的典型消費者/生產者模型。 –

相關問題