我正在使用多个线程读取.csv文件。每个线程读取.csv文件的一部分,例如。 thread1从line:214
读取到line:359
。
CSVReader reader1("C:\\file.csv", 214, 359);
在阅读过程中,数据字段存储在矢量实例中。
data[i].push_back(data_field);
在主要功能中,代码如下:
CSVReader reader1("C:\\file.csv", 214, 359);
CSVReader reader2("C:\\file.csv", 360, 517);
thread t1(&CSVReader::read_range, reader1);
thread t2(&CSVReader::read_range, reader2);
t1.join();
t2.join();
vector<vector<string>> temp_data = reader1.get_data(); // Here I have the problem
理想情况下,reader1.get_data()
应该在line:214
和line:359
之间返回数据。但是当我调查temp_data
时,我发现它根本没有改变。
我可以知道我错了吗?我该如何解决?
答案 0 :(得分:1)
创建线程时,您传递reader1
和reader2
的副本,因此副本不会被修改而不是原始对象。这意味着数据将添加到副本中,原始对象不会更改。要通过引用传递它们,请使用std::ref(reader1)
和std::ref(reader2)
。
如果你的CSVReader::read_range
函数接受了引用,你的代码不应该编译,但是一些错误的编译器(包括Visual C ++)接受它。
(N.B。一般来说,你应该已经显示了CSVReader::read_range
的定义或至少是签名,所以人们不必猜测你的代码是做什么的。)