2012-01-27 4 views
0

나는 스레드 풀을 가지고 있습니다. main() 함수는 클래식 풀 설정을 시작합니다. 보스 스레드와 몇 개의 작업자 스레드 대부분의 코드가 완료되었지만 누락 된 부분은 오류 처리입니다.C에서 기존 스레드를 catch

boss/worker 스레드 중 하나에 오류가 발생하면 pthread_exit()가 호출됩니다. main() 스레드는 풀을 다시 시작하기 위해 무언가 잘못되었는지를 어떻게 알 수 있습니까?

+0

왜 스레드를 종료하지 말고 다시 시작 하시겠습니까? 그건 깨끗한 디자인처럼 들리네 ... –

+0

@R .. 그게 내가 생각한거야. C에서 예외가 발생하지 않고 스레드의 외부 레벨에서 잡힐 수 있지만, 태스크에서 일종의 오류 보고서를 생성하고 또 다른 오류 보고서를 생성 할 수 있어야합니다. 이런 종류의 일은 C++에서 훨씬 더 쉽다고 말할 수 있습니다. –

+0

아니요,'pthread_exit'를 호출하면, 이미 취소 핸들러를 사용하여 스택을 풀고 정리 작업을 수행하지 않는 한, 'pthread_exit'를 호출하는 대신에'longjmp'를 당신이 시작한 곳으로 되 돌리십시오. 'pthread_exit' 호출을'longjmp'로 변경하는 것입니다. 또는 단순히'pthread_exit'를 호출하기 전에'pthread_create'를 호출하고 호출 스레드를 대체 할 새 스레드를 만들 수 있습니다. –

답변

0

, 또는 비 차단 기능을 원하는, 당신은 관련 뮤텍스와 함께 조건 변수를 사용할 수 있으며 구조가 포함 실패한 스레드, 오류 및 복구 정보가 필요합니다. 이러한 모든 변수는 전역 변수 여야합니다.

보스 스레드에서 먼저 오류 구조를 초기화 한 다음 뮤텍스를 잠 가야합니다.

pthread_mutex_lock(&mutex); 

그런 다음 pthread_cond_wait를 사용하여 조건이 발생할 때까지 기다립니다.

pthread_cond_wait(&cond, &mutex); 

조건이 발생하면 오류를 처리하고 pthread_join을 사용하여 스레드의 반환 값을 가져옵니다. pthread_cond_wait가 블로킹하는 것을주의하십시오. 비 블로킹 버전을 원할 경우, pthread_cond_timedwait에는 세 번째 매개 변수 인 struct timespec *이 있어야합니다.이 매개 변수는 대기 시간이 만료되는 절대 시스템 시간을 보유합니다. 결국 뮤텍스의 잠금을 해제하십시오. 실패한 작업자 스레드에서

pthread_mutex_unlock(&mutex); 

, 먼저 뮤텍스를 잠 가야 종료하기 전에, 다음 ERR 구조체를 채우기는 보스 스레드를 신호 뮤텍스 종료 잠금을 해제합니다. 보스 스레드에 신호를 보내려면 pthread_cond_signal 함수를 사용해야합니다.

pthread_cond_signal(&cond); 
0

당신은 사용할 수 있습니다

pthread_join(pthread_t child, void**); 

이 스레드의 반환 값을 얻을 수 있습니다. pthread_join은 스레드가 종료 될 때까지 대기하는 블로킹 함수입니다. 당신은에서 pthread_join을 위해 인수를 전달할 수 있습니다 : 당신이 오류 또는 복구 정보를 저장하려면

void pthread_exit(void *value_ptr); 
관련 문제