Intel® oneAPI Threading Building Blocks
Ask questions and share information about adding parallelism to your applications when using this threading library.
Announcements
This community is designed for sharing of public information. Please do not share Intel or third-party confidential information here.

parallel_for_each with std::list?

Nav
New Contributor I
234 Views
I have a rather large program which stores pointers to objects in a list. I thought of using parallel_for_each to process each object in the list.

So tried a small program:
[cpp]#include
#include
#include
using namespace std;
using namespace tbb;

class Item
{
   int i;
public:
   Item() {}
   Item(int ii):i(ii) {}
   Item(const Item& old) {i = old.i;}
   void doSomething() {printf("Whoopee I'm doing something! %d\n",i);}
};

class Doer
{
public:
   Doer() {}
   void operator()(Item* item) const//INFO: program won't work without this const
   {
      item->doSomething();
   }
};

int main()
{
   list v;
   for(int i=0;i<10000;++i) v.push_back(new Item(i));
   
   Doer d;   
   parallel_for_each(v.begin(), v.end(), d);
}[/cpp]

The program outputs all 10000 values of i without any problem.

As far as I read about parallel_for_each, it is supposed to always requires random access iterators. But std::list does not support random access iterators. Then how did my program work?

I've even seen the internals of how parallel_for_each is implemented (you use a parallel_do and spawn tasks). The do_task_iter class uses Iterator middle = my_first + k/2; and as I understand, the value held by 'Iterator middle' may become erroneous if it isn't a random access iterator? Correct?

So can I use std::list with parallel_for_each or not?
0 Kudos
1 Solution
Alexey_K_Intel3
Employee
234 Views
Yes you can.

parallel_for_each minimally requires input iterators. It's parallel_for that requires random access iterators.

View solution in original post

2 Replies
Alexey_K_Intel3
Employee
235 Views
Yes you can.

parallel_for_each minimally requires input iterators. It's parallel_for that requires random access iterators.
Nav
New Contributor I
234 Views
Thanks :) ............
Reply