2

pthreads を使用して単純な parallel_for を作成しようとしています。元のコードはこのようなものです。

#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が存在しない場合のために書き直します。これが私が書いたものです。コンパイルに問題があります。threadFunc のtemplate<typename Body>前に書き込むとエラーが発生します。

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

1 に答える 1

4

が関数テンプレートの場合threadFunc、必要に応じて関数を取得するために特殊化する必要があります。

pthread_create(&thread1, NULL, threadFunc<Body>, &rangeBody1);
                                         ^^^^^^
于 2012-07-25T09:09:49.323 に答える