스레드가 말을 안듣는군요.

익명 사용자의 이미지


여러개의 스레드를 생성한 상태에서

각 스레드가 결코 값을 리턴하지 않고 무한정 실행되게 만들었습니다.
스레드가 종료되는 시점은 특정 변수의 값을 점검해서
일정값이 되면 죽도록 했는데,

문제는 위의 형태에서 스레드가 값을 리턴하고 종료할때까지
다른 스레드들이 실행되지 않는다는 것입니다.

왜 그런지 궁금합니다.
환경은 FreeBSD입니다.

익명 사용자의 이미지

혹시 쓰레드 내에 무한 루프값이 있나요?
while 루프안에 usleep을 줘보세요..

익명 사용자의 이미지

#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로 설정됩니다.

문제는 위의 스레드가 첫번째만 수행되요, 나머지는 생성만 되고
실행이 안되네요.

익명 사용자의 이미지

음 소스상으로는 문제가 없어 보이네요
(공유변수를 잠금없이 접근하기는 하지만...)

그런데 종국님께서 생성만 되고..
쓰레드가 첫번째만 일을 하신다고 했는데
그걸 어떻게 알 수가 있죠?

printf("\nThis Value[%d]theadid[%d]",a,pthread_self());
찍어 줄때 thread아이디도 같이 찍어보세요.
아마 threadid가 돌아가면서 나올꺼에요
확실하게 관찰하려면 usleep을 좀더 큰 값으로 주어 보시구요

익명 사용자의 이미지

이 소스가 리눅스에서 컴파일 해서 돌리면 이상없이 돌아갑니다.

그런데, FreeBSD에서 돌리면 제가 말한대로 첫번째만 실행되고
나머지 스레드들은 이전것이 끝날때까지 실행되지 않습니다.

익명 사용자의 이미지

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으로 해주어서, 골고루 잘

돌 것 같네요..

익명 사용자의 이미지

만약 sliver님 말씀이 맞다면,,

프비랑 리눅스랑 쓰레드 구현에 차이가 있나보군요

리눅스는 one_to_one 모델이라..
PTHREAD_SCOPE_PROCESS와
PTHREAD_SCOPE_SYSTEM가 차이가 없거든요.
프비의 위의 기능 지원 여부를 확인해보면 확실히 알겠네요

익명 사용자의 이미지

static int exitFlag=0;으로 선언한 변수는

2개 이상의 쓰레드에서 접근하므로 volatile static int exitFlag=0;

으로 하세요~

익명 사용자의 이미지

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;
}

댓글 달기

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 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • 사용할 수 있는 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>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • You can use Textile markup to format text.
  • 사용할 수 있는 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>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 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>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.