2009-01-07 2 views
0

QNX에서 C++ 및 스레드를 사용하여 병렬 객체 지향 시스템을 만들고 싶습니다. 어떻게해야합니까? QNX C++의 객체 지향 스레드

내가 시도 :

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

함수 A는 함수에 대한 포인터 인 상태 :

void *functionA() 
{ //do something 
} 

그러나이 기능은 C++을 C에서 작동하지. C++에서 어떻게 작동시킬 수 있습니까?

답변

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 예상과 동일한 호출 규칙이 있는지 확인해야합니다.

0

나는 functionAextern "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); 
} 
1

귀하의 functionA 함수에 대한 포인터 아니다, 그것은 void*를 반환하는 함수입니다. 함수는 또한 인수로 void *를 취할 것으로 예상됩니다. 이 인수는 스레드에서 필요한 데이터에 대한 포인터를 전달하는 데 사용됩니다.

당신이

void functionA(void* threadData) { 

void* functionA() { 

를 교체 할 경우 나는 C와 C++ 모두에서 작동하는 기대.