2010-05-12 9 views
9

나는 스레딩에 조금 익숙하므로이 질문에 대한 순진함을 용서해야합니다.pthread_join은 어떻게 구현됩니까?

pthread_join은 어떻게 구현되며 스레드 스케줄링에 어떤 영향을 줍니까?

나는 항상 pthread_join을 while 루프로 구현했으며, 단순히 대상 스레드가 완료 될 때까지 호출 스레드를 양보하게했습니다. 이와 같이 (매우 근사적인 의사 코드)

정확하게 묘사되어 있습니까? 아니면이 과정을 대폭 단순화합니까?

건배!

답변

3

네, 그게 일반적인 생각입니다. 특정 구현에 대한 자세한 내용은 glibc을 참조하십시오.

+2

코드와 실제 코드 사이의 유일한 큰 차이점은 코드가 여분의 코어가있을 경우 코드가 연결 스레드가 CPU의 100 %를 소모하게한다는 것입니다. –

4

pthread_join은 pthread_exit를 호출하거나 main 함수가 종료 될 때 스레드가 종료 될 때 트리거되는 세마포어 대기로 내부적으로 구현됩니다. 어떤 경우

, glibc에 대한 소스 코드를 사용할 수, 스레드는 일반적으로 그와 관련된 약간의 구조, 스레드 컨텍스트를 가지고 (내가 거기에 몇 가지 정보 물건을 보았다)

+0

https://sourceware.org/git/?p=glibc.git;a=blob;f=nptl/pthread_join.c;h=6a87a8b329c3e34a57d65e86d45fa97a5fdb2fe2;hb=master#l89 마법이 일어나는 라인. – Benoit

1

구글 코드 검색을 시도합니다. 이 구조는 스레드를 "작동"시키는 데 필요한 모든 데이터 조각으로 채워질 수 있습니다.

예를 들어 데이터 구조의 루트는 해당 스레드의 스레드 고유 키에 액세스하고 해당 스레드를 종료 할 때이를 정리하기 위해 반복해야합니다.

일반적으로 해당 구조에는 뮤텍스와 유사한 잠금이 있고 다른 섹션에는 둘 이상의 잠금이 있습니다.

스레드 컨텍스트에는 종료 스레드가 종료 상태를 지정할 수있는 작은 필드가있을 수 있습니다. (void *pthread_exit에 의해 반환되거나 스레드 함수에서 반환 됨)

스레드 컨텍스트는 스레드의 상태 (아직 생성되지 않고 실행 중, 중지됨)를 나타낼 수도 있습니다.

조건 변수 또는 세마포어와 같은 동기화 프리미티브가있을 수 있으며 스레드는 종료 상태를 준비하고 종료 상태임을 나타내는 후 kick이 될 수 있습니다.

pthread_join 함수는 해당 동기화 프리미티브에서 대기 할 수 있습니다. 대기가 완료되면 함수는 상태를 해제하는 것 외에도 해당 스레드에 대한 자원 정리를 트리거 할 수 있습니다.

스레드는 조인 신호를 보낸 후에도 계속 실행됩니다. 이를 위해서는 계속해서 스택이있는 컨텍스트가 있어야합니다. 그런 다음 시스템은 백그라운드에서 스레드를 완전히 멈추는 문제를 해결해야합니다.

스레딩의 사용자 공간 구현은 커널에이를 지연시킬 수 있습니다. 예 : 어떤 신호는 꺼지거나 스레드가 완료되었음을 나타내는 어떤 신호가 될 수 있습니다. 이 시점에서 사용자 공간은 스레드가 더 이상 스택을 사용할 수 없다는 것을 알고 재활용 할 수 있습니다.

커널에서 스케줄러는 스레드를 "먹을"수 있습니다.스레드는 대부분의 자원을 정리 한 후에 절대로 리턴하지 않는 스케줄러에서 일부 함수를 호출 할 수 있습니다. 스레드를 죽은 것으로 표시하고 컨텍스트를 다른 스레드로 전환합니다. 쓰레드의 스택은 다시는 사용되지 않을 것이고 (그 함수는 결코 반환되지 않기 때문에), 작업 구조와 그것에 붙어있는 나머지 것들뿐만 아니라, 재사용 될 수있다.

관련 문제