FreeBSD 4.6 stable 에서 테스트 해보았습니다.
pthread_create 문에서 그냥 NULL로 attr 줘도 제대로 실행됩니다.
위에서 작성하신 소스는 한곳을 빼고는 모두 정상이었습니다.
실제로 스레드 생성 10개 되어서 10개 다 잘돌고 있습니다 -_-;;
단 화면에 보여줄때 value 값을 뿌리는게 잘못되어서 스레드가 안 돌고있
는듯 보였습니다 ^-^
밑의 소스를 보시면 아실듯 ^^ 그럼...
#include
#include
#include
#include
static int exitFlag=0;
void *loop(void *p)
{
int a = (int)p;
again
printf("\nThis Value[%d]",a);
if(exitFlag==1) return NULL;
usleep(5);
goto again;
}
void *loop2(void *p)
{
int a = (int)p;
again
printf("\nThis Value[%d]",a);
if(exitFlag==1) return NULL;
usleep(5);
goto again;
}
int main(void)
{
pthread_t thread[10];
int i;
int a=0;
Re: 스레드가 말을 안듣는군요.
혹시 쓰레드 내에 무한 루프값이 있나요?
while 루프안에 usleep을 줘보세요..
Re^2: 스레드가 말을 안듣는군요.(소스는 이렇습니다.)
#include
#include
#include
#include
static int exitFlag=0;
void *loop(void *p)
{
int a = *(int *)p;
again
printf("\nThis Value[%d]",a);
if(exitFlag==1) return NULL;
usleep(5);
goto again;
}
void *loop2(void *p)
{
int a = *(int *)p;
again
printf("\nThis Value[%d]",a);
if(exitFlag==1) return NULL;
usleep(5);
goto again;
}
void main(void)
{
pthread_t thread[10];
int i;
int a=0;
for(i=0;i<10;i++){
if(i%2==0) {
pthread_create(&thread[i],NULL,loop,&i);
}else{
pthread_create(&thread[i],NULL,loop2,&i);
}
}
for(i=0;i<10;i++){
pthread_join(thread[i],NULL);
}
}
소스가 위와 같을 때 각 스레드는 exitFlag가 1로 설정될때에만
수행을 종료하도록 했거든요.
물론 exitFlag는 어떤 signal이 걸렸을때 해당 핸들러에 의해
1로 설정됩니다.
문제는 위의 스레드가 첫번째만 수행되요, 나머지는 생성만 되고
실행이 안되네요.
Re^3: 스레드가 말을 안듣는군요.(소스는 이렇습니다.)
음 소스상으로는 문제가 없어 보이네요
(공유변수를 잠금없이 접근하기는 하지만...)
그런데 종국님께서 생성만 되고..
쓰레드가 첫번째만 일을 하신다고 했는데
그걸 어떻게 알 수가 있죠?
printf("\nThis Value[%d]theadid[%d]",a,pthread_self());
찍어 줄때 thread아이디도 같이 찍어보세요.
아마 threadid가 돌아가면서 나올꺼에요
확실하게 관찰하려면 usleep을 좀더 큰 값으로 주어 보시구요
Re^4: 스레드가 말을 안듣는군요.(소스는 이렇습니다.)
이 소스가 리눅스에서 컴파일 해서 돌리면 이상없이 돌아갑니다.
그런데, FreeBSD에서 돌리면 제가 말한대로 첫번째만 실행되고
나머지 스레드들은 이전것이 끝날때까지 실행되지 않습니다.
Re^5: 스레드가 말을 안듣는군요.(소스는 이렇습니다.)
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setscope(&attr,PTHREAD_SCOPE_SYSTEM);
pthread_create로 thread를 만들때, NULL attribute를 쓰지 마시고
위와같이 초기화 해서 pthread_create(&tid,&attr,.....) 이런식으로
하세요..
이렇게 하면 scheduling을 System scope으로 해주어서, 골고루 잘
돌 것 같네요..
Re^6: 스레드가 말을 안듣는군요.(소스는 이렇습니다.)
만약 sliver님 말씀이 맞다면,,
프비랑 리눅스랑 쓰레드 구현에 차이가 있나보군요
리눅스는 one_to_one 모델이라..
PTHREAD_SCOPE_PROCESS와
PTHREAD_SCOPE_SYSTEM가 차이가 없거든요.
프비의 위의 기능 지원 여부를 확인해보면 확실히 알겠네요
아 참 그리고..
static int exitFlag=0;으로 선언한 변수는
2개 이상의 쓰레드에서 접근하므로 volatile static int exitFlag=0;
으로 하세요~
Re: 제대로 된 소스를 올립니다
FreeBSD 4.6 stable 에서 테스트 해보았습니다.
pthread_create 문에서 그냥 NULL로 attr 줘도 제대로 실행됩니다.
위에서 작성하신 소스는 한곳을 빼고는 모두 정상이었습니다.
실제로 스레드 생성 10개 되어서 10개 다 잘돌고 있습니다 -_-;;
단 화면에 보여줄때 value 값을 뿌리는게 잘못되어서 스레드가 안 돌고있
는듯 보였습니다 ^-^
밑의 소스를 보시면 아실듯 ^^ 그럼...
#include
#include
#include
#include
static int exitFlag=0;
void *loop(void *p)
{
int a = (int)p;
again
printf("\nThis Value[%d]",a);
if(exitFlag==1) return NULL;
usleep(5);
goto again;
}
void *loop2(void *p)
{
int a = (int)p;
again
printf("\nThis Value[%d]",a);
if(exitFlag==1) return NULL;
usleep(5);
goto again;
}
int main(void)
{
pthread_t thread[10];
int i;
int a=0;
for(i=0;i<10;i++){
if(i%2==0) {
pthread_create(&thread[i],NULL,loop,(void *)i);
}else{
pthread_create(&thread[i],NULL,loop2,(void *)i);
}
}
for(i=0;i<10;i++){
pthread_join(thread[i],NULL);
}
return 0;
}
댓글 달기