는 내가 언급을 아직 권한이 없기 때문에 대답으로이 떠날거야 고맙지 만 난 내 최선을 줄 것이다. 나는 당신이 내부적으로 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()
은 차단 기능이므로 스레드에서 어떤 이점도 누릴 수 있도록 "수동으로"호출해야합니다.
클래스 소멸자에'pthread_join'을 넣을 수 없습니까? – NathanOliver
@ NathanOliver가 소멸자에 합류하는 것은 좋은 생각이 아닙니다. 마리아 당신은 필요한 기능을 달성하기 위해 스레드 풀을 사용할 수 있습니다. – paweldac
"내부적으로 가입"이란 무엇을 의미합니까? – immibis