порождение потока с использованием статической функции с использованием TBB в C ++ - PullRequest
0 голосов
/ 03 августа 2011

Я хочу использовать потоки TBB в C ++ и хочу использовать API "tbb_thread".

например у меня есть статическая функция в классе, как показано ниже

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

Я хочу использовать tbb_threadAPI для порождения потока с "ThreadRoutineFunction", которая определена выше класса.Как я могу добиться этого с помощью API tbb_thread.пожалуйста, обратите внимание, что я должен передать указатель на функцию потока потока.Кто-нибудь может дать мне простой пример, как это сделать?

1 Ответ

1 голос
/ 03 августа 2011

Похоже, ваш вопрос действительно "как мне получить указатель на static функцию-член?"

C ++ официально не имеет способа сделать это.Однако, согласно C ++ FAQ (примечание к вопросу 2), "функции указателей на static членов-членов обычно совместимы по типу с обычными указателями наfunctions. "

Ваши опции:

  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>;
    
...