QNX Объектно-ориентированные потоки в C ++ - PullRequest
0 голосов
/ 07 января 2009

Я хочу создать параллельную объектно-ориентированную систему в QNX, используя c ++ и потоки. Как мне это сделать?

Я пытался:

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

с функцией A, являющейся указателем на функцию:

void *functionA()
{ //do something
}

Однако эта функция работает только на C, а не на C ++. Как я могу заставить его работать в C ++?

Ответы [ 3 ]

2 голосов
/ 07 января 2009

См. "Как передать функцию указателя на член в обработчик сигнала, обратный вызов X-события, системный вызов, запускающий поток / задачу и т. Д.?" .

Короче говоря, вы передаете статическую функцию («батут») в качестве указателя на функцию. Вы передаете «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 голос
/ 30 октября 2009

Ваш functionA не указатель на функцию, это функция, возвращающая void*. Также ожидается, что функция будет принимать void * в качестве аргумента. Этот аргумент используется для передачи указателя на данные, необходимые в потоке.

Если вы замените

void* functionA() {

с

void functionA(void* threadData) {

Я ожидаю, что он будет работать как на C, так и на C ++.

0 голосов
/ 07 января 2009

Я думаю, вам нужно объявить functionA как extern "C" (и дать ему правильную подпись, см. Документацию для pthreads в 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);
}
...