0

C ++でTBBスレッドを使用し、「tbb_thread」APIを使用したい。

たとえば、私は以下のようにクラスに静的関数を持っています

template < typename threadFuncParamT >
class ThreadWrapper
{
public:
    static int ThreadRoutineFunction(void* pParam);
};

tbb_thread APIを使用して、クラスの上で定義された「ThreadRoutineFunction」でスレッドを生成したいと思います。tbb_threadAPIを使用してこれを実現するにはどうすればよいですか。スレッドルーチン関数へのポインタを渡さなければならないことに注意してください。誰かが私にこれを行う方法の簡単な例を教えてもらえますか?

4

1 に答える 1

1

あなたの質問は本当に「staticメンバー関数へのポインターを取得するにはどうすればよいですか?」のようです。

C++ には公式にはそれを行う方法がありません。ただし、C++ FAQ (質問 2 の注記) によると、「通常、staticメンバー関数へのポインターは、通常の関数へのポインターと型互換性があります。」

オプションは次のとおりです。

  1. 関数への通常のポインターを使用し、staticメンバー関数をポイントして、コンパイラーが文句を言うかどうかを確認します。

    int (*ptrFunction)(void*) = ThreadWrapper<Foo>::ThreadRoutineFunction;
    
  2. FAQが示唆することを行い、関数を宣言します(関数extern "C"staticのポインターを として宣言するextern "C"必要があり、関数をオーバーロードすることはできません):

    template <typename T> class ThreadWrapper {
        public:
        extern "C" static int ThreadRoutineFunction(void* param);
    };
    
    extern "C" int(*ptrCFunction)(void*) = ThreadWrapper<Foo>::ThreadRoutineFunction;
    
  3. staticメンバー関数を呼び出すだけの追加関数を作成します。

    template <typename T> int ThreadWrapperHelper(void* param)
    {
        return ThreadWrapper<T>::ThreadRoutineFunction(param);
    }
    
    int (*ptrFunction)(void*) = ThreadWrapperHelper<Foo>;
    
于 2011-08-03T14:46:53.490 に答える