쓰레드 for문의 i값을 인자값으로 넘기기.....

devanix의 이미지

 1 #include '<'stdio.h'>'
 2 #include '<'unistd.h'>'
  3 #include '<'pthread.h'>'
  4
  5
  6 void* do_loop(void *arg);
  7
  8 pthread_mutex_t mutx;
  9 int ncount;
 10
 11 int main(void){
 12
 13
 14         pthread_t t_id[3];
 15         void *status;
 16         int i;
 17
 18         if(pthread_mutex_init(&mutx, NULL) != 0){
 19                 perror("pthread_mutex_init() error ");
 20                 return 1;
 21         }
 22
 23         for(i=0; i<3; i++){
 24                 pthread_create(&t_id[i], NULL, do_loop, (void *)&i);
 25         }
 26
 27         for(i=0; i<3; i++){
 28                 pthread_join(t_id[i], &status);
 29         }
 30
 31         if(pthread_mutex_destroy(&mutx) != 0){
 32                 perror("pthread_mutex_destroy() error ");
 33                 return 1;
 34         }
 35
 36         fputs("programing is end \n", stdout);
 37
 38         return 0;
 39 }
 40
 41 void* do_loop(void *arg){
 42
 43         int i;
 44         int mydata;
 45         int id = *((int*)arg);
 46
 47
 48         for(i=0; i<10; i++){
 49         pthread_mutex_lock(&mutx);
 50                 printf("[%d]thread : %d\n", id, ncount);
 51                 mydata = ncount;
 52                 mydata++;
 53                 usleep(1000);
 54                 ncount = mydata;
 55         pthread_mutex_unlock(&mutx);
 56                 usleep(10);
 57         }
 58         return 0;
 59 }

안녕하세요.
위의 24줄의 pthread_create의 4번째 void*의 인자값으로 for문의 i값을 인자로 넘기려고 합니다.
근데 45중에 int id = *((int*)arg)로 id값을 받고
50줄에 id 값을 찍으면

결과값이 죄다 0으로 찍힙니다.

정확한 원인이 무엇인지 모르겠군요..

친절한 답변 부탁드립니다.

좋은 하루 되세요.

IsExist의 이미지

참조로 넘기지 말고 값으로 넘기세요.

pthread_create(&t_id[i], NULL, do_loop, (void *)i);

받는 쪽도 값으로 받습니다.
45         int id = (int)arg;

---------
간디가 말한 우리를 파괴시키는 7가지 요소

첫째, 노동 없는 부(富)/둘째, 양심 없는 쾌락
셋째, 인격 없는 지! 식/넷째, 윤리 없는 비지니스

이익추구를 위해서라면..

다섯째, 인성(人性)없는 과학
여섯째, 희생 없는 종교/일곱째, 신념 없는 정치

---------
간디가 말한 우리를 파괴시키는 7가지 요소

첫째, 노동 없는 부(富)/둘째, 양심 없는 쾌락
셋째, 인격 없는 지! 식/넷째, 윤리 없는 비지니스

이익추구를 위해서라면..

다섯째, 인성(人性)없는 과학
여섯째, 희생 없는 종교/일곱째, 신념 없는 정치

bushi의 이미지

전에 제가 올렸던 질문이랑 같군요.

생성된 쓰레드들이 맨 첫번째(i=0) pthread_join() 시점에서야 비로소 실행되기 시작했겠지요.

OTL

댓글 달기

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 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.