2010-04-27 2 views
3

C++을 사용하여 스레드 클래스를 구현합니다. 내 코드는 다음과 같습니다. 스레드 데이터에 액세스하는 방법에 문제가 있습니다. Thread 클래스에서 pthread_create() 함수를 사용하여 스레드를 만듭니다. EntryPoint() 함수를 호출하여 생성 된 스레드를 시작합니다. Run 함수에서 마스크 변수에 액세스하려고합니다. 세그먼트 변수가 항상 표시됩니다. 그래서, 내 질문은 여부를 새로 만든 스레드 원래 클래스의 데이터를 복사입니까? 스레드 자체 데이터에 액세스하는 방법?C++ multithread

class Thread { 
public: 
    int mask; 
    pthread_t thread; 

    Thread(int); 
    void start(); 
    static void * EntryPoint (void *); 
    void Run(); 
}; 

Thread::Thread(int a) { 
    mask =a; 
} 

void Thread::Run() { 

    cout<<"thread begin to run" <<endl; 
    cout << mask <<endl;  // it always show segmentfault here 
} 

void * Thread::EntryPoint(void * pthis) { 
    cout << "entry" <<endl; 
    Thread *pt = (Thread *) pthis; 
    pt->Run(); 
} 

void Thread::start() { 

    pthread_create(&thread, NULL, EntryPoint, (void *)ThreadId); 
    pthread_join(thread, NULL); 
} 

int main() { 
    int input_array[8]={3,1,2,5,6,8,7,4}; 
    Thread t1(1); 
    t1.start(); 
} 

답변

2

저는 사용중인 라이브러리에 익숙하지 않지만 EntryPoint는 스레드에 대한 포인터임을 EntryPoint가 어떻게 알 수 있습니까? 스레드 (this)는 pthread_create에 전달 된 것으로 보이지 않습니다.

+0

당신 말이 맞습니다. 이걸 pthread_create()에 전달해야합니다. 감사. – chnet

+0

개체 수명도주의하십시오. 아래의 내 게시물을 참조하십시오. 그렇지 않으면 문제가 계속 발생합니다. ;) –

1

교육용으로 Thread 클래스를 작성하는 것이 좋습니다. 그러나 그렇지 않다면, 왜 reinvent the wheel?

+0

그래, 교육 목적으로. 이미 "바퀴"에 대한 힌트를 주실 수 있습니까? 나는 다단계에 초보자입니다. – chnet

+0

Boost는 내가 링크 한 위대한 플랫폼 독립 스레드 구현을 제공합니다. 멀티 스레딩을 배우려고한다면 부스트를 사용하는 것이 좋습니다. 그것은 C++ 멀티 스레딩 문제를 배우면서 당신이 핵심적인 것을 깨닫지 않아도 될 것입니다. – wheaties

0

p 가능성이 높습니다. pthread_create에 올바른 인수를 전달했는지 다시 한 번 확인해야합니다.

1

기본적으로 문제는 스레드를 시작하자 마자 메인 엑시트와 로컬 Thread 인스턴스가 범위를 벗어납니다. 따라서 스레드 객체의 수명이 다른 스레드에 의해 제어되므로 이미 경쟁 조건을 도입했습니다.

또한 스레드를 생성 한 직후에 조금 불편한 Thread::start에 가입하는 것이 좋습니다.