2013-09-09 2 views
0

Примечание Я уже рассмотрел ответ, найденный здесь: 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 в надежде обойти тот факт, что форсированные потоки копируют все аргументы в хранилище потоков, но это не сработало для меня.

+0

Ваш параметр word_count передается по значению, а не по ссылке, поэтому он не будет работать даже без осложнений с использованием потоков. Обратите внимание на ссылочный параметр в примере «двойной», который вы цитируете. – Peter

+0

Я признаю, что он передается по значению, а не по ссылке. В примере, который я привел, они инкапсулируют аргумент, передаваемый по ссылке с идентификатором boost :: ref. В моем исходном коде я добавил те же идентификаторы без успеха. – jazzhandsjeff

+0

Они также определяют функцию потока как 'void function (const double input, double & output)'. Вам нужна функция, чтобы принять параметр по ссылке, и 'boost :: ref()', чтобы обернуть вашу ссылку на вызов, чтобы 'boost :: thread()' не копировал значение. Но серьезно, сделайте эту работу для одного потока, а затем выполните несколько потоков. – Peter

ответ

0

Ваш word_count параметр передается по значению, а не по ссылке:

void mtReadFile(char *filename, std::map<std::basic_string,float> word_count) 

вместо

void mtReadFile(char *filename, std::map<std::basic_string,float> &word_count) 

Это потерпит неудачу работать даже в однопоточных случае, который вы должны обязательно тест прежде чем пытаться выполнить более сложную многопоточность.

Функция должна принять ссылку, и вам нужно boost::ref(), чтобы предотвратить boost::thread() от копирования параметра перед вызовом функции.