2017-01-31 36 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的典型消费者/生产者模型。 –

相关问题