QNX面向对象的c ++线程

时间:2009-01-07 11:30:07

标签: c++ multithreading qnx

我想使用c ++和线程在QNX中创建一个并行面向对象的系统。我该怎么做?

我试过了:

pthread_t our_thread_id;
pthread_create(&our_thread_id, NULL, &functionA ,NULL);

函数A是指向函数的指针:

void *functionA()
{ //do something
}

但是此功能仅适用于C而不适用于C ++。如何使它在C ++中工作?

3 个答案:

答案 0 :(得分:2)

请参阅"How do I pass a pointer-to-member-function to a signal handler, X event callback, system call that starts a thread/task, etc?"

简而言之,您传递一个静态函数(“trampoline”)作为函数指针。您将“this”作为用户定义的参数传递。然后静态函数将调用反弹回真实对象。

例如:

class Thread {
public:
    int Create()
    {
        return pthread_create(&m_id, NULL, start_routine_trampoline, this);
    }

protected:
    virtual void *start_routine() = 0;

private:
    static void *start_routine_trampoline(void *p)
    {
        Thread *pThis = (Thread *)p;
        return pThis->start_routine();
    }
};

并且您需要确保C ++函数具有与pthread_create相同的调用约定。

答案 1 :(得分:1)

你的functionA不是指向函数的指针,它是一个返回void*的函数。该函数也应该以void *作为参数。此参数用于传递指向线程中所需数据的指针。

如果您更换

void* functionA() {

void functionA(void* threadData) {

我希望它能同时用于C和C ++。

答案 2 :(得分:0)

我认为你需要将functionA声明为extern "C"(并给它正确的签名,请参阅documentation for pthreads on QNX)。此函数将this intance:

作为用户参数
extern "C"
{
   void* DoSomethingInAThread(void* pGenericThis)
   {
     YourClass* pThis = reinterpret_cast<YourClass*>(pGenericThis);
     pThis->DoSomethingInAThread();
   }
}

int main()
{
  YourClass* pSomeInstance = new YourClass();
  pthread_t our_thread_id;
  pthread_create(&our_thread_id, NULL, &DoSomethingInAThread, pSomeInstance);
}