2011-01-02 3 views
4

POSIX 스레드 인터페이스에서 pthread_join(thread)은 지정된 스레드가 종료 될 때까지 차단하는 데 사용할 수 있습니다.pthreads - 스레드 그룹에 가입하여 종료 할 때까지 대기

자식 스레드가 종료 될 때까지 실행을 차단할 수있는 비슷한 기능이 있습니까?

이 자식 스레드가 아닌 프로세스

+0

저는 다른 사람들이 말했듯이, 당신은 이것을위한 조건 변수가 필요하다고 생각합니다. 그러나 관련 동기화 문제에 대해서는 장벽을 읽을 수도 있습니다. 그것들은 어떤 상황에서는 충분하지만 다른 것들에서는 충분하지 않은 이런 종류의 대기에 훨씬 더 간단한 인터페이스를 제공합니다. –

답변

7

나는 이것이 pthreads 그 자체로는 직접 가능하지 않다고 생각하지만, 당신은 상당히 쉽게 그 문제를 해결할 수 있습니다.

pthreads API를 사용하면 pthread_cond_wait 및 친구들을 사용하여 "조건"을 설정하고 기다릴 수 있습니다. 스레드가 종료하려고 할 때 대기중인 스레드를 깨우기 위해 조건을 신호로 보냅니다.

또 다른 방법은 파이프를 pipe으로 만들고 스레드를 종료 할 때 파이프에 write을 작성하는 것입니다. 파이프의 다른 쪽 끝에서 주 스레드가 select, poll, epoll 또는 선호하는 변종 중 하나로 기다리게하십시오. (다른 FD에서 동시에 대기 할 수도 있습니다.)

최신 버전의 Linux에는 동일한 작업을 수행하는 "eventfds"도 포함되어 있습니다 (man eventfd 참조). 그러나 최근에 추가 된 것에 유의하십시오. POSIX가 아닌 것은 Linux 전용이며, 최신판 인 경우에만 사용할 수 있습니다. (2.6.22 또는 그 이상)

필자는 개인적으로이 API가 파일 디스크립터와 유사하게 이러한 API를 처리하도록 설계되지 않은 이유를 항상 궁금해했습니다. 만약 그랬다면, 그들은 "eventables"것, 당신은 select 파일, 스레드, 타이머 ...

+1

"나라면, 그들은"이벤트 "가되고, 파일, 스레드, 타이머를 선택할 수 있습니다." +1 : WinAPI는 실제적으로 모든 것에 대해 WaitOnSingleObject 또는 WaitOnMultipleObjects를 호출 할 수 있다는 점에서 정말 우위에 있습니다. –

2

나는이 작업을 수행 할 수있는 POSIX 스레드 인터페이스의 모든 기능이 있다고 생각하지 않습니다에 대한 적용 제외 wait() UNIX 시스템 호출과 유사 할 것입니다.

자신 만의 버전을 만들어야합니다. 뮤텍스와 조건 변수에 의해 보호되는 플래그 배열 (스레드 당 하나의 플래그). "pthread_exit()"바로 전에 각 스레드가 뮤텍스를 획득하고 플래그를 설정 한 다음 "pthread_cond_signal()"을 수행합니다. 메인 쓰레드는 시그널을 기다린 후, 플래그의 배열을 검사하여 어떤 쓰레드가 join 하는지를 결정한다 (그때까지는 하나 이상의 쓰레드가있을 수있다).

0

당신은 사용자 정의는 pthread 조건 변수에 의해 하나의 구현해야 할 수 있습니다 :가 pthread_cond_signal는 pthread_cond_wait를(),()/어떤 pthread_cond_broadcast().

관련 문제