2013-07-31 3 views
1

Я читаю 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

Попробуйте уточнить ваш вопрос. Вы запрашиваете temp_data, где это нигде не описано. Когда вы push_back какие-то данные вам потребуется синхронизация, не так ли? – harper

ответ

1

При создании темы вы передаете копии из reader1 и reader2, поэтому копии модифицируются не исходные объекты. Это означает, что данные добавляются в копии, а исходные объекты не изменяются. Чтобы передать их по ссылке std::ref(reader1) и std::ref(reader2).

Если ваша функция CSVReader::read_range принимает ссылку, ваш код не должен компилироваться, но некоторые багги-компиляторы (включая Visual C++) принимают его.

(нотабене в общем, вы должны показали, определение или, по крайней мере, подпись CSVReader::read_range, чтобы люди не должны догадаться, что делает ваш код.)

+0

Привет, Джонатан. Большое спасибо за ваш ответ. Теперь проблема решена с вашим решением. Еще раз спасибо. – ChangeMyName

Смежные вопросы