C++多线程问题

C++ Multithreading Issue

本文关键字:问题 多线程 C++      更新时间:2023-10-16

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

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

现在,为了使我的代码更快,我想执行多线程。然而,我不明白,如何使用多线程运行上述算法,这样我会更快;正确输出。任何建议都会有帮助。

  1. 多线程处理并不一定能带来更快的程序
  2. 这个是否可以取决于你在那里做什么样的处理。如果它是按字符串执行的,并且不依赖于以前的结果,那么您可以在C++11中使用std::future。如果您不想使用C++11,请指定要使用的操作
  3. 如果你想这样做的话,你不能从一个串行流中并行引出多条线。原因应该很明显

如果我正确理解你的问题,那么你正试图从流中阅读,并对阅读材料进行块处理。

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

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

  2. 如果你从中读取的源不是真正的线性的,你可以创建多个流和几个工作者,每个人都处理自己的一组块。

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

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

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