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);
}
正確的答案。謝謝 – akaya 2012-07-25 10:03:11