기존 이솝 임베디드 포럼의 지식인 서비스가 게시판 형태로 변경되었습니다.

간단한 pthread 예제 인데요 제가 생각햇던거랑 결과가 다르게 나오는것 같아서 질문 드립니다.

 

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <pthread.h>

static int th_cnt = 0;

 

void *test_thread(void *arg){
 int *pid = (int *)arg;
 int id = *pid;
 printf("thread %d start\n", id);
 sleep(1000);
 printf("thread %d end\n", id);
  return NULL;
}


int main(int argc, char **argv){
 int th_num = 5;
 int i;
 pthread_t th_test;

 printf("MAIN start..\n");
 printf("Thread start..\n");
 for(i = 0; i < th_num; i++)
 {
  if(pthread_create(&th_test, NULL, test_thread, (void *)&i) != 0){
   printf("thread %d create Fail..\n", i);
   }
  pthread_detach(th_test);
  printf("-----pthread_detach end-----\n");
   }
  printf("MAIN end..\n");
 return 0;
}
---------------------------------------------------------------

소스에서 pthread를 5개를 돌리면서 print를 이용해서 흐름과정을 출력하는데요

제가 생각한 결과는

MAIN start..

Thread start..

thread 0 start

thread 1start

thread 2start

thread 3start

thread 4start

thread 0end

thread 1end

thread 2end

thread 3end

thread 4end

-----pthread_detach end-----

-----pthread_detach end-----

-----pthread_detach end-----

-----pthread_detach end-----

-----pthread_detach end-----

이렇게 되리라 예상을 했는데요 물론 스레드 돌면서 위의 순서는 바뀌더라도 start, end, detach end 이 출력이 5쌍이

나오리라 생각을 했는데요

 

실행 결과는

# ./a.out
MAIN start..
Thread start..
-----pthread_detach end-----
-----pthread_detach end-----
 thread 2 start
 thread 2 start
-----pthread_detach end-----
-----pthread_detach end-----
-----pthread_detach end-----
MAIN end..
# ./a.out
MAIN start..
Thread start..
-----pthread_detach end-----
-----pthread_detach end-----
-----pthread_detach end-----
-----pthread_detach end-----
-----pthread_detach end-----
MAIN end..
두번 실행 했을때마다 start가 찍힐때도 있고 안찍힐때도 있는데요 end는 전혀 찍히지 않고 detach end는 5개는 잘 나옵니다

 

이게 왜 이렇게 나오는건가요?

detatch() 함수가 스레드 함수 종료될때까지 기다리고 메모리해제를 시키는 걸로 알고 있어서 저의 예상대로 나올지 알고 있었는데 실제로는 detach end가 start보다 먼저 출력이 되고 이러니 제가 잘 못 생각하고 있는것 같기도하구요;;

 

추가

pthread_join으로 하면 예상처럼 나오는데요 pthread_detach를 사용하면 왜 저렇게 나오는걸까요?

 


추락천사

2013.10.30 02:50:34
*.117.45.2

thread handler 하나를 가지고 5번 돌려쓰고 계시네요.

pthread_t th_test; -> pthread_t th_test[5];

pthread_create(&th_test, NULL, test_thread, (void *)&i) -> pthread_create(&th_test[i], NULL, test_thread, (void *)&i)

 

요렇게 해주심 되겠습니다.

요래도 잘 안되면, pthread_create 성공 이후에 usleep을 좀 줘보세요(100~1000 정도?)

biokk

2013.10.30 03:10:58
*.190.105.1

음 다른 곳에서 예제 사이트를 보고 한 내용인데요 thread handler를 하나를 갖고 저렇게 여러개의 스레드를 생성하는 것은 잘 못된것인가요?

쭈암

2013.10.30 05:51:23
*.131.225.178

detach하면 알아서 메모리 해제하기는 하나..

main이 종료되면 전체 프로세스가 죽습니다.

전부 실행되는 것을 보장하려면 join하거나 thread간 동기화를 통해서 죽는거 확인해야 합니다.


biokk

2013.10.30 06:40:00
*.190.105.1

스레드 함수가 다 끝나기도 전에 detach 함수가 실행이 되는데 detach메모리해제만 보장을 하는건가요?

쭈암

2013.10.30 08:45:14
*.186.87.8

쓰레드 함수가 다 끝나는거 기다리면 쓰레드 쓰는 이유가 있나요?

DETACH는  그냥 쓰레드 속성만 바꿔주는 겁니다.(JOIN 안할거니까 알아서 뒷정리 하라는 거.. 그래서 DETACH입니다. 독립해서 알아서 잘 하라는 거죠 )


기다려 주거나 하는 거 아닙니다.

기다리는건 JOIN쓰셔야 합니다.


고도리

2013.10.30 13:37:42
*.200.239.210

쭈암님 말씀대로.......


main이 끝나면 process가 종료된 것입니다.

즉, thread건 머건 없어지는 겁니다.


해서 pthread_join()이란 함수가 있어서 thread가 끝날때까지 기다려서 return을 처리해 주거나,

detach해서 에라......모르겠다....라고 할 경우는 


while(1)

     sleep(10);


이런 식으로 대기 모드로 들어가셔야 할겁니다.


detach는 내가 신경 안쓰겠다는 것입니다만, 끝나는 것을 기다려 주겠다라고 하는 것은 아닙니다.

즉, main이 끝나면.....나머지는 메롱입니다....

biokk

2013.10.31 17:40:35
*.190.105.1

detatch가 메모리해제는 보장한다고 하는데

pthread_create에 스레드가 생성되고 스레드가 종료되기 전에 바로 detach를 호출한다면

스레드함수가 종료되면서 알아서 메모리가 해제 되는게 맞는건가요?

즉 메인스레드에서 detach를 설정하면 스레드함수가 종료되면 알아서 메모리해제 한다. 이렇게 이해를 했는데요;

 

 

쭈암

2013.11.01 02:52:59
*.223.3.196

맞습니다만. 부모가 죽으면 자식이 죽는게 문젭니다.

메인 쓰레드 종료되면 프로세스가 종료되면서 자식 쓰레드가 종료되었건 말았건 전체가 죽는 겁니다. 프로세스가 쓰레드 상위라서 프로세스 종료 되면 딸린 쓰레드는 다 죽습니다. 


Main 함수 끝났은데 무엇을 기대하시나요?


다른 쓰레드가ㅡ종료 되는 거라면 join하는거고

Detach 헸다는 건 join안하겠다는 건데요.

무시하고 종료하는 거죠.


List of Articles
번호 제목 글쓴이 날짜sort 조회 수
428 램디스크의 사이즈를 12k, 8k로 생성할때의 차이점 [1] pedor11 2013-10-21 1779
427 Exynos5410 ISP 제어 관련 질문입니다 [1] 선수 2013-10-21 4036
426 arndale jb-mr1 es6 와이파이 문제 질문요. [7] 고로다 2013-10-22 3761
425 라즈베리파이나 cubox의 1080p 동영상 재생 [3] eou4 2013-10-29 2593
» pthread 소스 루틴이 이해가 잘안되는데요(소스참조) [8] biokk 2013-10-30 1992
423 SquashFS 마운트 에러 질문입니다. [3] 강해야산다 2013-10-31 2215
422 부팅시 disk image starting at 0. 나오고 부팅이 멈추는데요 [1] biokk 2013-11-04 3203
421 화웨이 3G Modem을 Jellybean에 사용 해보신 분 계신가요?? [2] 천동이 2013-11-05 1809
420 리눅스 개발환경에 대해(이더넷, OTG) 활용 방안 [1] pedor11 2013-11-06 3276
419 Arndale board에 flashing이 되지 않습니다. [3] faublousK 2013-11-06 1947
418 스트리밍 TV를 구현하는 방법이 궁금합니다 [10] 무우도사 2013-11-06 1963
417 이솝보드 부팅SD카드를 만드는데 질문입니다. [2] pedor11 2013-11-07 2167
416 linux 가 keyboard 나 mouse 로 동작이 가능할까요? [3] 강경완 2013-11-09 1817
415 h264 mfc 인코딩관련질문드립니다. file [9] 개뒷치기 2013-11-10 2306
414 Exynos5250의 비디오 재생 능력 [4] eou4 2013-11-12 1811
413 3G Modem을 USB 타입말고 방법은 없을까요?? [2] 천동이 2013-11-15 1733
412 앱을 Frameworks 단에서 돌릴수는 없을까요??? 천동이 2013-11-16 1403
411 adb로 kernel message 보기 [2] 테크 2013-12-02 1742
410 ubuntu에서 qt프로그램 실행 관련해서 질문드립니다 file 춤선생 2013-12-04 1570
409 S3C6410에 Micro SD를 쓰는데 에러 발생 윤상인 2013-12-05 1847

사용자 로그인