2013-04-02 5 views
2

while 루프를 종료하는 것에 대한 질문이 있습니다. 저는 문자열을 출력하는 두 개의 쓰레드를 만드는 코드를 작성하고 있습니다. main() 부분은 500 밀리 초마다 점 (".")을 인쇄해야합니다. 두 번째 스레드가 종료 된 후 while 루프를 종료하는 방법을 알려주십시오. ... 안녕하세요 ... 세계 .... THE END무한 루프를 종료하는 방법 (스레딩)

감사합니다.

int main() 
{ 
    int mls = 0.5 ; 
    pthread_t thread1; 
    pthread_t thread2; 

    struktura param1 = { "Hello", 2}; 
    struktura param2 = { "World", 4}; 

    pthread_create(&thread1, NULL, thread, &param1); 
    pthread_create(&thread2, NULL, thread, &param2); 

    while(1) 
    { 
     printf("."); 
     fflush(stdout); 
     sleep(mls); 
    } 

    pthread_join(thread1, NULL); 
    pthread_join(thread2, NULL); 

    printf("THE END\n"); 
    return 0; 
} 
+1

"int mls = 0.5"? 0.5는 정수가 아닙니다. –

답변

-1

terminate c thread에서 볼 수 있듯이 pthread_exit를 사용해보세요.

+0

올바르게 이해한다면, pthread_exit 함수는 스레드의 처리를 종료하지만, thread2가 끝나고 루프가 깨지면 루프를 체크해야합니다. – user2188452

+0

'pthread_exit()'는 OP 문제를 해결하는 데 도움이되지 않습니다. – alk

1
while(pthread_kill(thread1, 0) == 0 && pthread_kill(thread2, 0) == 0) 
{ 
     printf("."); 
     fflush(stdout); 
     sleep(mls); 
} 

int pthread_kill (pthread_t thread, int sig);

이 함수를 사용하여 스레드의 상태를 검색 할 수 있습니다. sig 인수가 0이면 신호가 보내지지 않지만 오류 검사는 여전히 수행됩니다 (예 : 스레드가 '활성'인지 확인하는 데 사용할 수 있음).

반환 값이 thread가 'alive'보다 0이면 0 또는 오류 코드 (ESRCH - ID 스레드가있는 스레드가없고이 경우 중요하지 않은 스레드가 하나 더 있음)를 반환 할 수 있습니다. 반환 된 값이 지정된 스레드보다 오류 코드 (ESRCH) 인 경우 예를 들어 찾을 수 없습니다. 죽었어'.

+0

이 특별한 경우에 적용됩니다. pthread-ids가 재활용 될 때 동일한 프로세스에서 더 많은 스레드가 작성되어 실행 중이고 독립 실행 형으로 종료되면 더 이상 작동하지 않을 수 있습니다. 따라서'thread1'과/또는'thread2'의 값은 두 개의 'while'테스트 사이에서 독립적으로 실행되는 하나 또는 두 개의 태스크에 의해 재사용 될 수 있습니다. 보다 안전한 솔루션은 각 스레드에 조건/뮤텍스를 사용하여 마지막 작업이 종료 될 때 종료를 알리는 것입니다. – alk

2

문제를 생각한 후에 주 사용 사례가 실제로 두 스레드 ("Hello"스레드와 "World"스레드)가 사라 졌는지 확인하려면 다른 방법으로 사용할 수 없다는 결론을 내립니다. pthread_join() 모두에 있습니다.

pthread_join()은 호출 스레드를 차단하므로 당연히 요청한대로 도트를 그리기 위해 세 번째 스레드 (스레드 "도트")를 시작해야합니다.

이렇게 두 번째 스레드 (스레드 "Hello"및 스레드 "World")가 pthread_join()에 대한 두 개의 차단 호출에서 반환 된 후 기다리는 스레드 - main() 스레드가이 세 번째 스레드 (스레드 "Dots")에 신호를 보냅니다. . 이 작업이 완료되면 세 번째 스레드 (스레드 "점")가 간단히 완료됩니다. 후자는 아무도 그것이 끝내기를 기다리지 않기 때문에 분리 될 수 있습니다.

관련 문제