【问题标题】:Intel tbb parallel_for: pass class member function with parameters?Intel tbb parallel_for:带参数传递类成员函数?
【发布时间】:2014-11-01 13:13:49
【问题描述】:

是否可以将类成员函数(带参数)传递给parallel_for?类似的东西:

void classT::A(const tbb::blocked_range<std::size_t>& r,b) {}

void classT::B(e,f,g) { 
   tbb::parallel_for( blocked_range<size_t>(0,n), <need to call A with parameter b, 
                                                                       along with r> ) 
}

【问题讨论】:

  • 如果您可以使用 C++11 功能,lambda-expression 可能会帮助您。
  • 优秀;我能够做到这一点:
  • parallel_for(tbb::blocked_range(0,n), [=](const tbb::blocked_range<:size_t>& r) { this->A(r, b ); } );

标签: c++ multithreading tbb


【解决方案1】:

this example

他们创建一个类并为该类提供所需的所有参数。 在该类中还有一个operator(),它对数据进行操作。 然后使用该类的实例调用 parallel_for。

parallel_for(blocked_range<int>(0, nElements, 100), ArraySummer( p_A, p_B, p_SUM_TBB ) ); 
//The class is arraysummer

你是怎么做到的:

class ClassTACaller
{
   int* m_parameter;
   ClassT* m_Tinstance

public:

   ClassTACaller(ClassT* tinstance, int* param):m_parameter(param), m_Tinstance(tinstance){}
   void operator() ( const blocked_range<int>& r ) const 
   {
      m_Tinstance->A(r, param);
   }
};

parallel_for(blocked_range<int>(0, nElements, 100), ClassTACaller(&classTinstance, &x));

【讨论】:

  • 谢谢。我在搜索中确实遇到了这样的例子。但我想知道是否有办法将我的任务打包到类的成员函数本身中(就像人们使用 boost::thread 和 boost::bind 所做的那样),而不是为每个任务构建单独的类。这可能吗?
  • 如果你的编译器支持c++11,你可以使用std::bind,它应该可以工作。 std::bind 和我做的一样,但它使用模板。
  • 不幸的是,似乎没有。我试过了;这是它的样子: parallel_for(tbb::blocked_range(0,n), std::bind( &classT::A, this, b, std::placeholders::_1 )); 有几个错误,第一个是:
  • /usr/local/include/tbb/parallel_for.h:102:37: 错误:没有匹配函数调用类型为 'const std::__1::__bind > &, const tbb::blocked_range &), classT *, tbb::concurrent_vector > &, std::__1::placeholders::__ph &>' void run_body( Range &r ) { my_body( r ); }
  • 只是为了澄清:concurrent_vector 是“b”参数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-20
  • 1970-01-01
相关资源
最近更新 更多