这里有几个完整的例子,一个使用parallel_for,另一个使用parallel_for_each。

更新2014-04-12:这些显示了我认为是现在使用TBB的漂亮老式的方式;我添加了一个separate answer使用parallel_for与C 11 lambda。

#include "tbb/blocked_range.h"

#include "tbb/parallel_for.h"

#include "tbb/task_scheduler_init.h"

#include

#include

struct mytask {

mytask(size_t n)

:_n(n)

{}

void operator()() {

for (int i=0;i<1000000;++i) {} // Deliberately run slow

std::cerr << "[" << _n << "]";

}

size_t _n;

};

struct executor

{

executor(std::vector& t)

:_tasks(t)

{}

executor(executor& e,tbb::split)

:_tasks(e._tasks)

{}

void operator()(const tbb::blocked_range& r) const {

for (size_t i=r.begin();i!=r.end();++i)

_tasks[i]();

}

std::vector& _tasks;

};

int main(int,char**) {

tbb::task_scheduler_init init; // Automatic number of threads

// tbb::task_scheduler_init init(2); // Explicit number of threads

std::vector tasks;

for (int i=0;i<1000;++i)

tasks.push_back(mytask(i));

executor exec(tasks);

tbb::parallel_for(tbb::blocked_range(0,tasks.size()),exec);

std::cerr << std::endl;

return 0;

}

#include "tbb/parallel_for_each.h"

#include "tbb/task_scheduler_init.h"

#include

#include

struct mytask {

mytask(size_t n)

:_n(n)

{}

void operator()() {

for (int i=0;i<1000000;++i) {} // Deliberately run slow

std::cerr << "[" << _n << "]";

}

size_t _n;

};

template struct invoker {

void operator()(T& it) const {it();}

};

int main(int,char**) {

tbb::task_scheduler_init init; // Automatic number of threads

// tbb::task_scheduler_init init(4); // Explicit number of threads

std::vector tasks;

for (int i=0;i<1000;++i)

tasks.push_back(mytask(i));

tbb::parallel_for_each(tasks.begin(),tasks.end(),invoker());

std::cerr << std::endl;

return 0;

}

两者都使用g tbb_example.cpp -ltbb在Debian / Wheezy(g 4.7)系统上编译(然后以./a.out运行)

(参见this question,用std :: mem_fun_ref或boost :: bind替换“invoker”)。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐