2014-11-01 69 views
2

是否可以將類成員函數(帶參數)傳遞給parallel_for?沿線的東西:英特爾tbb 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>) 
} 
+2

如果你可以使用C++ 11點的特性,拉姆達表達式可以幫助你。 – yohjp 2014-11-01 14:33:05

+0

優秀;我是能夠做到這一點: – mskb 2014-11-01 15:16:10

+0

parallel_for時(TBB :: blocked_range (0,n)時,[=](常量TBB :: blocked_range &R){ \t \t \t這 - > A(R,B); \t \t}); – mskb 2014-11-01 15:16:34

回答

1

看看this example

他們創建一個類,並提供所有需要的參數。 該類別也是一個operator(),它對數據做了一個oppertion。 然後用該類的一個實例調用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)); 
+0

謝謝。我在搜索中遇到過這樣的例子。但是我想知道是否有辦法將我的任務打包在類的成員函數本身中(比如人們用boost :: thread和boost :: bind的方式),而不是爲每個任務構建單獨的類。這可能嗎? – mskb 2014-11-01 13:37:56

+0

如果你的編譯器支持C++ 11,你可以使用'std :: bind',它可以工作。 'std :: bind'和我做的一樣,但是它使用模板。 – Vincent 2014-11-01 13:46:54

+0

不幸的是,似乎並沒有。我試過了;這裏是它的樣子:_parallel_for(tbb :: blocked_range (0,n),std :: bind(&classT :: A,this,b,std :: placeholders :: _ 1)); _並且有幾個錯誤,其中第一個是: – mskb 2014-11-01 13:49:56