2012-07-25 109 views
2

我想寫一個簡單的parallel_for使用pthreads。 原始碼是這樣的。Pthread模板參數錯誤

#ifdef HAVE_TBB 
template<typename Body> static inline 
void parallel_for(const BlockedRange& range, const Body& body) 
{ 
     tbb::parallel_for(range, body); 
} 
#else 
template<typename Body> static inline 
void parallel_for(const BlockedRange& range, const Body& body) 
{  
     body(range); 
} 
#endif 

我重寫TBB不存在的情況。這是我寫的。我有編譯它的問題。當我在它之前編寫template<typename Body>時,threadFunc會給出錯誤。

In function 'void cv::parallel_for(const cv::BlockedRange&, const Body&)': 
error: no matches converting function 'threadFunc' to type 'void* (*)(void*)' 
error: candidates are: template<class Body> void* cv::threadFunc(void*) 

這些是我得到的錯誤消息。必須有一個簡單的修復可能。謝謝。

struct MyStruct { 
    BlockedRange range; 
    Body& body; 
}; 

//template<typename Body> 
static void* threadFunc(void *arg) { 
    MyStruct<Body> *rangeBody = (MyStruct<Body>*) arg; 
    rangeBody->body(rangeBody->range); 
} 

template<typename Body> static inline 
void parallel_for(const BlockedRange& range, const Body& body) 
{ 
    BlockedRange& range1 = BlockedRange(range.begin(), range.end()/2); 
    BlockedRange& range2 = BlockedRange(range.end()/2, range.end()); 

    MyStruct<Body> rangeBody1; 
    rangeBody1.range = range1; 
    rangeBody1.body = body; 

    MyStruct<Body> rangeBody2; 
    rangeBody2.range = range2; 
    rangeBody2.body = body; 

    pthread_t thread1, thread2; 
    pthread_create(&thread1, NULL, threadFunc, (void*) &rangeBody1); 
    pthread_create(&thread2, NULL, threadFunc, (void*) &rangeBody2); 
    pthread_join(thread1, NULL); 
    pthread_join(thread2, NULL);  
} 

回答

4

如果threadFunc是一個函數模板,那麼你就需要專門它得到一個功能要求:

pthread_create(&thread1, NULL, threadFunc<Body>, &rangeBody1); 
             ^^^^^^ 
+0

正確的答案。謝謝 – akaya 2012-07-25 10:03:11