pthread 실행 지속 방법과 pthread_join에 대한 질문.

cococo의 이미지

제가 아직 pthread에 대한 개념을 잘 못 잡고 있는 게 아닌가.. 하는생각이 드는데요.

아래의 코드가 있습니다.



void *fnc1()
{
	int i;
                .
	.
	.
	while(1)
		printf("thread1");
	.
	.
	.
//	pthread_exit();
}


void *fnc2()
{
	.
	.
	.
	while(1)
		printf("thread2");
	.
	.
	.
//	pthread_exit();
}


int main()
{
	.
	.
	.
	
	
	pthread_create(fnc1);
	pthread_create(fnc2);
	.
	.
	.
//	while(1)
	;;
	printf("program end");
	return 1;
}


여기서... main함수의 while 문이 없을 때 프로그램이 종료되는 게 이해가 안 됩니다.
종료된다는 건... 메모리에 fnc1, fnc2를 띄워놓고 main이 종료되어 버리기 때문에 프로그램이 종료되는 건가요?
그렇다면, main함수는 단지 thread들을 생성시키는 역할만 한다 하더라도, 모든 thread가 종료되기 전 까지는 (쓰레드가 종료되었는지를 어떻게 알아내는지는 차치하더라도) 종료되면 안된단 소리인가요?

또하나... pthread 로 검색해서 읽다가, 쓰레드를 종료할때 pthread_join이란 걸 쓴다는 걸 알게 되었는데요.
위의 코드에서는 pthread_join이 없지 않습니까?
그렇다면, 위의 ( while(1)없는 ) 프로그램을 실행시켰을 때, 프로그램이 설사 종료되더라도 pthread가 사용한 자원은 남아있게 되나요? 예를 들어 fnc1 의 변수 i 라던가.... -_-; 하지만 main이 이미 끝났으니 pthread가 사용한 자원도 다 해제되었을 것 같기도 하고...

man pthread_join 에 써 있는 설명을 보면 남아있을 것 같긴 한데, 확인해 볼 방법을 모르겠네요.

한 수 부탁드립니다.

좋은 하루 되세요.

mach의 이미지

1) 주 쓰레드는 사망하면 아니되옵니다.
2) 그외 임의의 개수의 쓰레드는 사망시 자원반납을 해야하는데, 이는 프로그래머의 책임입니다.
- 주 쓰레드에서 pthread_join()을 호출한다.
- pthread_create()시 파라메터를 세팅해서 종료시 자동 detach되게 한다. 생성함수에 파라메터로 줌. (쓰레드 어트리뷰트세팅)
- 각 쓰레드가 시작될때, pthread_detach() 함수를 호출해서 자기 스스로 사망시 뒷정리를 하도록 하게 한다.
3) 반납을 안하면?
- 마치, malloc()만 호출하고 free호출안하는 것과 같다.

4) while(1)로 가는걸 좋아한다면, while(1) pause(); 형태로 호출해서 cpu time을 가급적 다른 얘들이 놀게 주도록 노력합시다.

------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.

mach의 이미지

음 부가적으로 가끔은 이런 경우가 있습니다.

가상 시나리오) 주 쓰레드는 뭐하는데 쓰는 물건인고?
1) 멀티쓰레드로 프로그램을 수행했다.
2) 특정 쓰레드에게 시그널을 보낼 필요가 생겼다.
문제) 콘솔이나 다른 프로세스에서 , 주 쓰레드에게야 시그널이 가지만, 그외 쓰레드에게 시그널을 줄 방법이 없다?!
답변) 주 쓰레드가 시그널을 핸들링해서 다른 쓰레드들에게 시그널을 주는 구조로 프로그램을 설계할 수 있을 것이다. 그외 타이밍등을 다루면 되겠지.

------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.

cococo의 이미지

math님, 명쾌한 설명 정말 고맙습니다. 좋은 주말 되시기 바랍니다!!

덧글 : 첨에 while(1) 만 해놓고 된다고 그냥 썼었는데... 몰랐으면 큰일났을 뻔 했네요. ^^;;

익명 사용자의 이미지

ckbcorp wrote:
math님, ...

:evil: 쩝~ 고교때 수학 잘한다는 얘기를 잠시들었을뿐,(그것도 다른 과목에 비해... :oops: ) math안한지가 너무 오래 되었다는...... :oops:

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.