2014-02-06 1 views
0

스레드를 생성하는 classA가 있고 변수가 false로 설정 될 때까지 스레드가 실행되기를 원합니다.C++ pthread가 작동하지 않습니다.

ClassA::ClassA(): 
m_bContinue(true), 
{ 
    pthread_mutex_init(&m_mutex, NULL); 
    pthread_create(&m_thWorkThread, NULL, &ClassA::ThreadProc, this); 
} 

내가 스레드 pClassA-만큼 실행> 계속()가 true를 돌려 원하는 :

내가 좋아하는 스레드를 만들 수 있습니다.

void* ClassA::ThreadProc(void *p) //ThreadProc defined as static member function 
{ 
    ClassA *pClassA = reinterpret_cast<ClassA*>(p); 

    if(pClassA != NULL) 
    { 
     while(pClassA->Continue()) 
     { 
      printf("in the while \n "); 

     } 
    } 
    else 
     printf("pClassA null \n"); 
} 

계속해서 m_bcontinue가 생성자에서 true로 설정됩니다.

bool ClassA::Continue() 
{ 
    return bContinue; 
} 

루프를 실행하면 "while while"이 인쇄되고 프로그램이 중지됩니다. 내가 strace 할 때, 나는 + + SIGSEGV +++에 의해 살해되었다는 메시지를 보았다. 그리고 내가 좋아하는 while 루프 변경할 때 :

while(1){} 

올바르게 작동합니다. 내가 뭘 놓치고 있니?

답변

0

pthread_create을 사용하여 멤버 기능을 시작할 수 없습니다. 대신에 this을 통과 정상적인 기능을 사용하고 호출에 필요한 기능 : 대신 당신은 ++ (11)와 C 사용할 수

void *ThreadProc (void *p) 
{ 
    reinterpret_cast<ClassA*>(p)->ThreadProc (p); 
    return 0; 
} 

... 
pthread_create(&m_thWorkThread, NULL, &ThreadProc, this); 

을 또는 해당 클래스 멤버 함수를 실행 허용 std::thread.

+0

"정상적인 기능"이란 무엇입니까? 제 경우에는 ThreadProc을 정적 멤버 함수로 정의합니다. ThreadProc 함수로 다른 클래스를 정의한다는 것을 의미합니까? –

+0

@AvbAvb 아, 정적입니다. 정상적으로는 비회원 함수를 의미하지만 정적이라도 괜찮습니다. 그렇다면 코드가 정상적으로 작동하고 루프가 손상되는 것입니다. 아마도 다른 곳에서는 힙 손상 때문일 것입니다. –

0

유형 A의 객체가 스레드보다 수명이 짧을 수 있습니까? 그것은 물체 A가 너무 빨리 죽는 것처럼 보입니다. while(1)을 사용하면 더 이상을 참조하지 않습니다.

0

빠른 질문. pthread_join은 어디에 있습니까? 나는 당신이 그것을 놓친 havent 바랍니다. 그냥 궁금해서.

관련 문제