2016-12-01 1 views
0

코어 덤프 오류가 발생하는 코드가 있습니다. 각 C 인스턴스는 자체 스레드를 생성 한 다음 실행합니다. 정적 함수와 클래스 인자 "count"에 문제가 있다고 생각합니다. 오류를 발생시키는 코드를 주석 처리 할 때 오류가 발생하지 않습니다.클래스에서 pthreads를 사용하는 동안 세그먼트 화 오류가 발생했습니다.

#include <iostream> 
    #include <pthread.h> 
    using namespace std; 

    class C { 
     public: 
     int count; 
     C(int c_): count(c_){} 
    public: 
     void *hello(void) 
     { 
      std::cout << "Hello, world!" <<std::endl; 
      std::cout<<count; // bug here!!! 
      return 0; 
     } 

     static void *hello_helper(void *context) 
     { 
      return ((C *)context)->hello(); 
     } 

     void run() { 

      pthread_t t; 
      pthread_create(&t, NULL, &C::hello_helper, NULL); 
     } 

    }; 

    int main() { 

    C c(2); 
    c.run(); 

    C c2(4); 
    c2.run(); 

    while(true); 

    return 0; 
    } 

답변

1

답변을 작성하기로 결심했습니다. 스레드를 어떻게 작성했는지에 따라 hello_helpercontextNULL으로 전화를 걸었습니다. C++에서는 null 포인터에 대한 멤버 함수를 완전히 호출 할 수 있으며 멤버 요소에 액세스하지 않으면 오류가 발생하지 않습니다.

귀하의 경우에는 count을 인쇄 할 줄을 추가하십시오. 이제 null 포인터 인 null 포인터의 멤버 변수에 액세스하고 있습니다.

#include <iostream> 
class Rebel 
{ 
    public: 
    void speak() 
    { 
     std::cout << "I DO WHAT I WANT!" << std::endl;   
    }  
}; 
int main() 
{ 
    void * bad_bad_ptr = NULL; 
    ((Rebel*)bad_bad_ptr)->speak(); 
} 

출력 :

당신의 pthread_create 전화를 수정하여

I DO WHAT I WANT!

pthread_create(&t, NULL, &C::hello_helper, this);을, 당신이 지금해야합니다 (this 포인터를 전달하는

다음은 멀리지고 있었는지의 예 on member variable에 접근 할 수있는 유효한 인스턴스

+0

mascoj 맞아, 그 인수는 클래스 인스턴스에 대한 포인터입니다, 나는 그 시점에서 부조리했다. . – eral

-1

스레드를 생성하는 동안이 포인터를 NULL 대신 전달하여 문제를 해결했습니다. os는 이전 스레드와 동일한 스레드를 두 번 int로 작성했다고 생각하십니까?

+1

아니요, 당신은'''hello_he '''''''의 문맥으로 lper''' ..... ..... – mascoj

+0

왜 그렇게 중요한가요? print count 변수를 사용하지 않았을 때 괜찮습니다. – eral

+0

이 답변을보다 유용하게 사용하려면 (그리고 덜 downvote bait) 변경 한 코드, 변경 한 코드를 추가하고 이것이 어떻게 문제를 해결했는지 설명하는 것이 좋습니다. – user4581301