【发布时间】:2015-01-03 00:00:34
【问题描述】:
我想从输出文件中逐行并行读取。每个线程读取一行然后处理数据。同时下一个线程必须读取下一行。
std::ifstream infile("test.txt");
std::mutex mtx;
void read(int id_thread){
while(infile.good()){
mtx.lock();
std::string sLine;
getline(infile, sLine);
std::cout << "Read by thread: " << id_thread;
std::cout << sLine << std::endl;
mtx.unlock();
}
}
void main(){
std::vector<std::thread> threads;
for(int i = 0; i < num; i++){
threads.push_back(std::thread(parallelFun, i));
}
for(auto& thread : threads){
thread.join();
}
return 0;
}
当我运行这段代码时,我得到了这个: 第一个线程读取所有行。我怎样才能让每个线程都读一行?
编辑
正如 cmets 中所述,我需要做的只是更大的测试文件。 谢谢大家!
【问题讨论】:
-
有什么问题?无论如何读取都是由互斥锁序列化的。
-
线程就是这样工作的,它们运行一段时间,然后让另一个线程运行一段时间,以此类推。如果一个线程运行足够长的时间来读取一个短文件中的所有行,那么你必须想办法一次只读取一行(比如发出条件变量的信号?)。
-
如果您希望读取与处理并行发生,您应该在读取该行后立即解锁互斥锁,而不是在您处理完您读取的数据之后。
-
有一个可能的问题是,在检查文件是否仍然良好后立即安排线程,仅在文件完成读取后才返回。这不是死锁情况,但它可能会在大文件和许多线程上产生 IO 错误。解决方法是将
infile.good()移动到临界区,并使用其结果更新bool,用于while 循环。 -
您要求的基本上是线程滥用。说:“[我]想要:第一个线程读取第一行,第二个线程第二行,...,第 n 个线程第 n 行”几乎是在说:“我想要串行执行。”如果要串行执行,请不要使用多个线程。
标签: c++ multithreading file-io line-by-line