스레드 관련 질문이에요...
글쓴이: moonlight / 작성시간: 토, 2003/04/05 - 7:09오후
중복일지도 모르지만, 여러 고수님들의 조언 부탁드립니다.
#include<stdio.h> #include<stdlib.h> #include<sys/types.h> #include<pthread.h> #include<unistd.h> void* printnum(void *arg); #define MAXTHREAD 5 main() { pthread_t tid[MAXTHREAD]; int *t; int i; for(i=0; i<MAXTHREAD; i++) { if(pthread_create(&tid[i],NULL,printnum,(void*)i) != 0) { printf("Error %d\n",i); exit(1); } } for(i=0; i<MAXTHREAD; i++) { if(pthread_join(tid[i],NULL) != 0) { printf("Errir join %d\n",i); } else { printf("%d thread is done\n",i); } } return 0; } void* printnum(void *arg) { int j; for(j=0; j<1000; j++) { printf("%d : %d\n",(int*)arg,j); } }
이렇게 했는데, 제가 생각한 결과는 5개의 스레드가 경쟁적으로
숫자를 출력할줄 알았는데,
결과는 하나의 스레드가 숫제를 다찍고, 다음 스레드...다음 스레드
이런식의 결과가 나오는군요...
그게 맞는지, 아니면, 제가 잘못한건지, 조언 한마디 부탁드립니다
Forums:
Re: 스레드 관련 질문이에요...
OS 의 스케쥴링 정책에 따라 실행됐을 겁니다.
아마도 사용 중이신 컴퓨터가 단일 프로세서에 프로세싱 속도가 빨라서
지금과 같은 현상이 나타났을 가능성이 많구요.
루프 안의 숫자를 훨씬 더 크게 해보세요.
그래도, 매우 경쟁적으로 서로 번갈아가며 실행되진 않을 겁니다.
Orion Project : http://orionids.org
쓰레드 실행 순서.
쓰레드를 UNBOUND로 수행시키셨기 때문에(process scope)
그러한 현상이 발생할 수 있습니다.
이 경우 CPU를 양보하지 않으면 일반적으로 나머지 UNBOUND쓰레드는
동작할 수 없지만, 명시적으로 CPU를 양보하거나, mutex관련
thread wait으로 빠지는 경우 CPU를 양보합니다.
위의 경우도 아닌 경우는 UNBOUND 쓰레드가 I/O를 기다릴 경우인데
이때는 시스템에 따라 CPU를 양보할 수도 아닐 수도 있다고 합니다.
한편, 선과 같은 시스템에서는 concurrency level을 암묵적으로
쓰레드 라이브러리에서 동적으로 조절합니다.
그래서, 님의 프로그램을 수행시키면 시간이 조금 지나면,
모든 쓰레드가 동시에 동작하는 것을 확인하실 수 있습니다.
리눅스의 경우는 system scope, process scope 자체가 없기 때문에
default로 system scope로 동작합니다.
따라서, 첫번째 답변하신 분과 같이 루프 숫자를 크게 하면
서로 번갈아가면서 동작하는 것을 확인하실 수 있을 겁니다.
김성진 드림
고도의 추상화, 극도의 구체화, 에디슨을 그리워하다.
스레드 스케줄링 방식
아래와 같은 쓰레드 스케줄링 방식을 변경할 수 있는 함수가 있습니다.
pthread.h에 여러가지 define이 있으므로 바꿔가면서 테스트 해 보시기 바랍니다.
pthread_attr_t thrd_attr;
.
.
pthread_attr_setschedpolicy(&thrd_attr, SCHED_RR);
.
.
pthread_create(&tid, &thrd_attr, func, args);
댓글 달기