有可能向多个读者扇出一个istream吗?

时间:2017-01-31 19:13:12

标签: c++ c++11 istream

我有std::istream可以使用。是否有可能以某种方式将其传递给多个读者,这些读者可能会寻求并从不同的位置读取?

如果没有,如果我将其限制为std::ifstream的情况怎么办?

1 个答案:

答案 0 :(得分:-1)

你已经回答了你的问题。如果它是文件流(ifstream)你得到随机访问(只读;你可以设置开放模式),多个线程通过打开一个线程的每个ifstream流来访问同一个文件应该没有问题。 C ++标准没有提及ifstream的线程安全性。对于泛型istream(socket,cin),如果使用get()方法,则会消耗输入流。我没有看到任何istream的线程安全文档。 peek()方法不会消耗输入流,但仍会改变istream的内部状态。如果多个线程在同一个istream上执行seek(),则行为未定义。您不确定C ++语言的内部锁定。 seek()基本上是解除引用内部缓冲区的某种指针。

我建议您有一个线程将istream读入某个缓冲区(构造对象(生成器)或简单的原始内存),然后,多个线程可以使用结果(使用者)。这是典型的消费者/生产者同步;任何多线程教科书都会教你如何做到这一点。