Примечание Я уже рассмотрел ответ, найденный здесь: Return Double from Boost thread, однако предлагаемое решение не работает для меня.Возврат Контейнер от Boost Thread
У меня есть следующие TID-бит исходного кода
void run(int tNumber, std::vector<char *>files, std::map<std::basic_string,float>word_count)
{
boost::thread_group threads;
std::map<std::basic_string,float> temp;
for(int i = 0; i < tNumber; ++i)
threads.create_thread(boost::bind(mtReadFile,files[i],boost::ref(word_count)));
threads.join_all()
}
Это функция, которая создает новые темы для вызывающего процесса. Затем эти потоки вызывают экземпляр mtReadFile.
void mtReadFile(char *filename, std::map<std::basic_string,float> word_count)
{
//function like things
}
Мне нужно, чтобы word_count возвращался из каждого потока в вызывающий процесс. Я попробовал boost :: ref в надежде обойти тот факт, что форсированные потоки копируют все аргументы в хранилище потоков, но это не сработало для меня.
Ваш параметр word_count передается по значению, а не по ссылке, поэтому он не будет работать даже без осложнений с использованием потоков. Обратите внимание на ссылочный параметр в примере «двойной», который вы цитируете. – Peter
Я признаю, что он передается по значению, а не по ссылке. В примере, который я привел, они инкапсулируют аргумент, передаваемый по ссылке с идентификатором boost :: ref. В моем исходном коде я добавил те же идентификаторы без успеха. – jazzhandsjeff
Они также определяют функцию потока как 'void function (const double input, double & output)'. Вам нужна функция, чтобы принять параметр по ссылке, и 'boost :: ref()', чтобы обернуть вашу ссылку на вызов, чтобы 'boost :: thread()' не копировал значение. Но серьезно, сделайте эту работу для одного потока, а затем выполните несколько потоков. – Peter