1

我正在使用多个线程读取 .csv 文件。每个线程读取 .csv 文件的一部分,例如。line:214thread1 从到读取line:359

CSVReader reader1("C:\\file.csv", 214, 359);

在读取过程中,数据字段存储在向量实例中。

data[i].push_back(data_field);

在 main 函数中,代码如下:

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,我发现它根本没有改变。

我可以知道我错了吗?我该如何解决?

4

1 回答 1

1

当您创建线程时,您会传递and的副本,因此修改的是副本而不是原始对象。这意味着数据被添加到副本中,而原始对象保持不变。要通过引用传递它们,请使用and 。reader1reader2std::ref(reader1)std::ref(reader2)

如果您的CSVReader::read_range函数需要引用,则您的代码不应编译,但一些有缺陷的编译器(包括 Visual C++)会接受它。

(注意,一般来说,您应该显示定义或至少签名,CSVReader::read_range这样人们就不必猜测您的代码做了什么。)

于 2013-07-31T17:00:03.667 回答