Запуск функций в векторе с использованием TBB дает неправильный вывод - PullRequest
0 голосов
/ 21 января 2019

Вот мой код, который должен записывать цифры от 0 до 19 на экране (в случайном порядке).

vector<std::function<void(void)>> tasks;
for(int i=0; i<20;i++)
     { 
        tasks.push_back( [&](){cout<< i<<endl;} );  
     }

tbb::parallel_for(size_t(0), size_t(tasks.size()), [&](int K) {(tasks[K])();});

Выход:

20
20
20
20
20
20
20
20
20
20
20
20
20
20
20
20
20
20
20
20

Что я делаю не так? Как мне сделать так, чтобы записать числа от 0 до 19?

1 Ответ

0 голосов
/ 21 января 2019

Вы передали ссылку на i при добавлении нового задания:

   tasks.push_back( [&](){cout<< i<<endl;} );  
   //               ^^^ here

Когда задание выполнено, i достигло 20, так что каждый поток будет печатать.

Вместо этого вы, вероятно, захотите получить копию из i:

    tasks.push_back([=i]{ std::cout << i << '\n'; });

(= здесь необязательный; я включил его, чтобы прояснить ситуацию)

...