-5

我有以下算法来处理文件:

//open ifstram to read each line

//open ofstream to output each line

while (getline(ifstream, line1)){

getline(ifstream, line2) ;
getline(ifstream, line3) ;  
getline(ifstream, line4) ;
//
getline(ifstream, line10) ;

for(int i = 1 ; i <= 10 ; i++)
// process line number i (some sort of character replacement, substring extraction)

output each line

}

现在,为了让我的代码更快,我想执行多线程。但是,我不明白,如何使用多线程运行上述算法,因此我将获得更快和正确的输出。任何建议都会有所帮助。

4

2 回答 2

2
  1. 多线程并不一定会导致更快的程序。
  2. 这是否可以完成取决于您在那里进行什么样的处理。如果它是按字符串完成的并且不依赖于先前的结果,则可以在 C++11 中使用 std::future 。如果您不想使用 C++11,请指定您想要使用的内容。
  3. 如果您正在尝试这样做,您不能从串行流中并行引导多条线路。原因应该很明显。
于 2013-02-12T11:54:17.880 回答
0

如果我正确理解您的问题,您正在尝试从流中读取并以块的形式处理读取的材料。

在这个例子中有几个并行化的机会。

  1. 如果您正在从文件中读取,操作系统可以在您处理第一个块时继续将文件的内容读入缓冲区。

  2. 如果您正在读取的源不是真正的线性,您可以创建多个流和多个工作人员,每个工作人员都在自己的一组块上工作。

  3. 在您无法控制数据源的情况下,下一个机会是拥有一个 I/O 线程,将读取的块放入某种队列中,该队列驱动任意数量的工作人员。这类似于 #2,但拆分发生在您的流程中。这可能很有帮助,例如,如果您需要保留块之间的顺序,在这种情况下,单个输出工作人员将再次将块收集到队列中,并在它们到达时对其进行排序和输出。

其中哪一个实际上适用于您的情况只能由您确定。此外,根据 I/O 与所需处理和线程开销的比率,解决方案 #3 可能是

  • 有害(与低 I/O 和低处理成本相比,高线程开销)
  • 仅对单个 worker 有用(线程开销低且处理成本低于 I/O;在这种情况下,单个 worker 将在读取下一个块之前完成处理)
  • 受限于平台中的内核数量(线程开销和 I/O 成本低,但处理能力高;在这种情况下,额外的工作人员只会争夺有限的资源,如缓存,这会导致不必要的低效率)
于 2013-02-13T16:52:50.283 回答