pthread 동기 인가요? 비동기 인가요?
글쓴이: biokk / 작성시간: 월, 2013/10/28 - 8:07오후
예를들어
pthread(&id, NULL, th_test, &test);
pthread_detach(id);
void th_test()
{
while(1)
{
....
}
}
이런소스가 있으면 pthread에 의해서 th_test가 스레드 함수로 따로 동작으로 하는데 그 안에는 무한루프로 되어 있는데
동기라면 무한루프가 종료되지 않기때문에 프로그램이 종료되지 않는이상 pthread_detch()가 실행이 안될것이고
비동기라면 무한루프에 상관없이 바로 스레드가 종료될것 같은데
동기로 동작하는게 맞는거죠?;;
Forums:
제 생각에는 동기든 비동기든...프로그램이 종료하지
제 생각에는 동기든 비동기든...
프로그램이 종료하지 않으면 계속 무한루프 돌것 같습니다.
이게 기본적인 동작 아닌가요?
주 스레드가 끝나면, 프로그램 종료로 처리되고,
다른 실행중인 스레드는 일찍 죽는(?)일이 발생할 수 있습니다.
이런것을 방지하기 위해서 동기화 기법이 사용될 수도 있겠죠...
동기화 기법이 전혀 사용되지 않고 있다면, 스레드는 비동기라고 볼수 있을 것 같습니다.
질문하신 내용은...
pthread_detach 가 아니라 pthread_join 이 더 적합해 보이네요.
join 에서 계속 block 되겠죠.
Dig it.
Thread의 관리에 관해
Thread loop condition을 상수 1 또는 true로 하는 것은 바람직하지 않습니다.
거의 반드시라고 해도 좋을만큼 Thread 생성을 담당하는 Thread쪽에서(main 함수도 Thread입니다)
Loop condition을 제어하는 flag를 Thread 인자로 넘겨주고,
종료시에는 이 flag를 가지고 Thread가 스스록 종료되도록,
Thread 생성측의 종료는 이렇게 생성한 Thread들의 종료를 pthread_join으로 대기하여 확인되도록 하는 게 좋습니다.
join, detach에 대해
리눅스 프로그램 경험이 많이 없어서 그러는데요
몇 블로그나 책을 보면 join, detach 가 스레드 종료시 메모리 해제를 하는데
detach가 join에 비해 메모리해제를 확실히 해준다고 해서 detach가 좋다고 했었던걸 봤던 기억이 있었거든요
(detach는 join에 비해 메모리해제를 보장한다 이렇게 알고 있습니다;;)
두개 모두 스레드 종료될때까지 기다리다가 스레드함수가 종료되면 종료시키는 것이 아닌지요
말씀하신 내용은 맞습니다.
답글을 달아놓고 이전 소스들을 찾아봤더니
main thread에서 다른 Thread들을 모두 생성하고 종료시키는 것이 아니라
다른 핸들링 thread에서 임의의 또다른 thread를 생성하고 종료시키는 경우가 생겨서
플래그 처리를 해야 했던 경우였네요.
Process가 종료되면 그 Process가 만들어둔 Thread들은 전부 종료되는데,
이 때 임의 생성한 Thread를 detach 시켜두면 자원의 반납이 보장되는 게 맞다고 알고 있습니다.
아래의 게시글도 유용하리라 생각합니다.
https://kldp.org/node/90637
다만 원론적인 이야기로 돌아가서,
원칙적으로 쓰레드가 종료되는 시점을 결정하는 것은 해당 쓰레드 외부가 아니라
자신의 루틴에서 pthrad_exit로 마무리 짓는 것이 맞다고 알고 있습니다.
detached thread를 만드는 것은, 꼭
detached thread를 만드는 것은, 꼭 필요한 상황이 아니면, 별로 추천하고 싶지 않습니다.
main thread에서 해당 thread가 끝났는지 여부를 판단할 수 있도록 pthread_join()을 쓰는 것이 좋습니다.
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://cinsk.github.io/cfaqs/
댓글 달기