2012-09-11 8 views
2

일단 클라이언트 연결을 허용하면 C 프로그램을 작성합니다. 이런 일이 생기면 두 개의 스레드를 생성하려고하지만이 작업을 수행 할 수 없습니다.포크 다음에 pthreads 생성

pthread_t t1, t2; 
    void *r_loop(); 
    void *w_loop(); 
    . 
    . 
    . 

sockfd = accept(r_sockfd, (struct sockaddr *) &address, &len); 
if (sockfd < 0) 
    printf("Error accepting\n"); 

if (!fork()) 
{ 
    int r_thread = pthread_create(&t1, NULL, r_loop, NULL); 
    int w_thread = pthread_create(&t2, NULL, w_loop, NULL); 

    pthread_join(r_thread, NULL); 
    pthread_join(w_thread, NULL); 
    exit(0); 
} 

이 기능을 실행하면 r_loop 및 w_loop 함수가 실행되지 않습니다.

+0

함수는'void * (void *)'로 선언해야합니다. –

+0

힌트 : 항상 API 호출의 반환 값에서 오류를 테스트하십시오. 오류 코드는 친구입니다. – cdarke

답변

5

문제는 다음과 같을 수 있습니다. pthread_create() 성공 성공시 0을 반환합니다. pthread_join()에 잘못된 값 (t1과 t2 대신에 0)을 전달하면 즉시 반환하게됩니다. 그런 다음 다음과 같은 종료()는 또한 pthread_join()t1t2 대신 r_threadw_thread을 통과해야 새로운 시작 스레드

+0

정말 고마워요! 지금 작동합니다 – user1190650

+1

Linux/glibc를 사용하고 있습니까? pthread의 구현에 대해 실망스러운 점은'pthread_t'는 (실제로 포인터를 저장 했음에도 불구하고)'long'으로 정의되어 컴파일러가 이와 같은 오류를 잡을 수 없다는 것입니다. 'pthread_t'가'struct __pthread_struct *'또는 이와 유사한 것으로 정의 되었다면, 컴파일러는 매우 유익한 에러 메시지를 발생 시켰을 것입니다. –

1

을 죽인다.