쓰레드 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