在C ++中使用TBB使用静态函数生成线程

时间:2011-08-03 14:13:10

标签: c++ tbb

我想在C ++中使用TBB线程,并希望使用“tbb_thread”API。

例如我在类中有静态函数,如下所示

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

我想使用tbb_thread API来生成一个带有“ThreadRoutineFunction”的线程,该线程在类上面定义。我怎样才能使用tbb_thread API实现这一目标。请注意,我必须将指针传递给线程例程函数。任何人都可以举例说明如何做到这一点吗?

1 个答案:

答案 0 :(得分:1)

听起来你的问题确实是“如何获得指向static成员函数的指针?”

C ++没有正式的方法可以做到这一点。但是,根据C++ FAQ(问题2中的注释),“指针 - static - 成员函数通常类型兼容常规指针 - 功能“。

您的选择是:

  1. 使用常规指针指向函数,将其指向static成员函数,查看编译器是否抱怨:

    int (*ptrFunction)(void*) = ThreadWrapper<Foo>::ThreadRoutineFunction;
    
  2. 执行常见问题解答建议,并声明您的函数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>;