2016-07-11 3 views
1

두 클래스를 하나씩 실행하고 싶습니다. 그러나 나는 그들에게 영원한 사람이되기를 바란다. 예를 들어, 나는 그런 일이 :다중 클래스 내의 다중 스레드

class A 
{ 
    pthread_t threadA; 

    void runThreadA() { pthread_create(... arguments_here ...)}; 
} 

class B 
{ 
    pthread_t threadB; 

    void runThreadB() { pthread_create(... arguments_here ...)}; 
} 

은 현재 내가 작성하고 각 클래스에 대해 내부적으로 두 개의 스레드를 실행,하지만 내 메인은 다음과 같이이다 : 나는 두 개의 스레드에 참여할 수있는 방법

main() 
{ 
    A.runThreadA(); 
    B.runThreadB(); 

    pthread_join(threadA, NULL); 
    pthread_join(threadB, NULL); 

    return 0; 
} 

을 또한 내부적으로 두 스레드가 두 개가 병렬로 실행되도록합니까? 내가 이해할입니다

희망은 ... 는

+1

클래스 소멸자에'pthread_join'을 넣을 수 없습니까? – NathanOliver

+0

@ NathanOliver가 소멸자에 합류하는 것은 좋은 생각이 아닙니다. 마리아 당신은 필요한 기능을 달성하기 위해 스레드 풀을 사용할 수 있습니다. – paweldac

+0

"내부적으로 가입"이란 무엇을 의미합니까? – immibis

답변

1

는 내가 언급을 아직 권한이 없기 때문에 대답으로이 떠날거야 고맙지 만 난 내 최선을 줄 것이다. 나는 당신이 내부적으로 join 스레드를 말할 때 해석 할 것이고, main 함수에 여분의 join 라인을 작성하지 않고도 클래스 내부와 자동적으로 의미한다는 것을 해석 할 것이다. 즉, 대답은 '예'입니다. 다음과 같은 이유로 클래스 내부에서 join을 호출 할 수는 있지만 그렇게하는 것은 효과가 없습니다.

class1 
{ 
    std::thread *t1; 
    void DoWork1(); 
    void CreateThread1() { 
     t1= new std::thread(&class1::DoWork1, this) 
     JoinThread1(); 
    } 
    void JoinThread1(){ 
     if (t1.joinable()) { 
      t1.join(); 
     } 
    } 

}; 

class2 
{ 
    std::thread *t2; 
    void DoWork2(); 
    void CreateThread2() { 
     t2= new std::thread(&class2::DoWork2, this) 
     JoinThread2(); 
    } 
    void JoinThread2(){ 
     if (t2.joinable()) { 
      t2.join(); 
     } 
    } 
}; 

가 이제 우리는 이론적으로 완료 :

이 예 (나는 내가 더 편안 해요 때문에 표준 : 스레드를 사용하는거야,하지만 pthread와 매우 동일한 작동합니다) 고려하자 이 목표는 Class1::CreateThread()라고 할 때마다 자동으로 기본 스레드에서 join() 호출을 추가하지 않아도 참여할 수 있습니다. 우리는 join()이 차단 기능이라는 것을 기억해야합니다. 따라서 을 main()에 호출하면 스레드가 완료되고 결합 될 때까지 차단되어 오직 Class2::CreateThread()을 호출 할 수 있습니다. 따라서이 방법을 시도해 보면 스레드가 병렬로 실행되고 있지 않으며 스레드를 처음 사용하는 데 전혀 도움이되지 않습니다.

클래스의 소멸자에 join()을 호출하는 인수가 있지만 여전히 소멸자를 어딘가에 호출해야하므로 사용자가 찾고있는 것과 동일한 자동화를 얻지 못하고 있습니다.

이 예제는 매우 간단하지만 잘하면 뭔가 중요한 것을 보여줍니다. 스레드에서이 기능을 구현하는 클래스가 어디에 있든 관계없이 두 번째 스레드를 만드는 것과 같은 다른 작업을 수행하는 데 주 스레드를 사용하지 못하게됩니다 (따라서 스레드의 목적을 크게 상쇄 함). 어쨌든 메인에서 수동으로 스레드를 조인하는이 멤버 함수를 호출하는 유일한 차이점은 위의 예제에서와 같이 클래스의 멤버 함수가된다는 것입니다.

TLDRjoin()은 차단 기능이므로 스레드에서 어떤 이점도 누릴 수 있도록 "수동으로"호출해야합니다.

+0

대단히 감사합니다. 매우 이해할 수 있습니다. 마지막으로 스레드를 "Detached"로 설정하고 main() 내부에 무한 루프를 생성했습니다. 나는이 반응을 내 필요에 더 잘 이해했다. – maria

관련 문제