1

複数のスレッドを使用して .csv ファイルを読み込んでいます。各スレッドは、.csv ファイルの一部を読み取ります。thread1 は からline:214まで読み取ります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:214line:359temp_data

私が間違っていることを知ってもいいですか?どうすれば修正できますか?

4

1 に答える 1

1

スレッドを作成すると、 と のコピーが渡されるため、コピーは元のオブジェクトではなく変更されます。つまり、データはコピーに追加され、元のオブジェクトは変更されません。それらを参照渡しするには、 and を使用します。reader1reader2std::ref(reader1)std::ref(reader2)

関数が参照を取る場合、CSVReader::read_rangeコードはコンパイルされませんが、一部のバグのあるコンパイラ (Visual C++ を含む) はそれを受け入れます。

CSVReader::read_range(NB 一般に、人々がコードの動作を推測する必要がないように、定義または少なくとも署名を表示する必要があります。)

于 2013-07-31T17:00:03.667 に答える