-4

我有以下算法与文件工作:C++多线程问题

//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 

} 

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

+0

如果你希望得到一个答案,你应该提供一些工作代码 - 这不是。如果你不这样做,你的问题可能会被关闭。 – mvp 2013-02-12 11:52:32

+1

为什么标记为C? – 2013-02-12 11:52:37

+0

其实,我不知道如何在多线程中运行以上算法。我必须执行大量的I/O操作,但我不知道如何使I/O线程独立。 – user1838343 2013-02-12 11:53:57

回答

2
  1. 多线程并不一定会导致更快的程序。
  2. 是否这可以完成取决于你在那里做什么样的处理。如果它是按字符串完成的并且不依赖于以前的结果,则可以在C++ 11中使用std :: future。如果您不想使用C++ 11,请指定做什么想要使用。
  3. 如果这是你想要做的,你不能从串行流中并行地引导多行。原因应该是显而易见的。
+0

实际上,我想通过线程1读取第1-10行,第20-30行,通过第2行读取第10-20,30-40行。这可能吗?以及如何输出相同的文件? – user1838343 2013-02-12 12:02:02

+0

不,那不行。 – Cubic 2013-02-12 12:13:20

+0

+1有线程通信开销。为了使这个开销值得,值得交流的工作应该是实质性的。 10行文字不重要。 10000行文字*可能会使其值得。 – 2013-02-12 12:42:27

0

如果我正确理解你的问题,你正试图从一个流中读取并以块读取材料。

本例中有几种并行化机会。

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

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

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

其中哪一个实际适用于您的情况只能由您决定。此外,取决于I/O所需的处理和线程的开销的比率,将溶液#3可能是

  • 有害(高螺纹的开销相比,低的I/O和低加工成本)
  • 唯一有用(低线程开销并且处理成本低于I/O;在这种情况下,单个工人将在读取下一个块之前完成处理)
  • 受平台中内核数量的限制(低线程开销和I/O成本,但高处理;在这种情况下,额外的工作人员只会争取有限的资源,如缓存,这会导致不必要的低效率)