PGR21.com
이전 질문 게시판은 새 글 쓰기를 막았습니다. [질문 게시판]을 이용바랍니다.
Date 2008/11/03 23:18:34
Name MoreThanAir
Subject pthread 관련 잘 아시는 분 계신가요?
#include <stdio.h>
#include <memory.h>
#include <stdlib.h>
#include <pthread.h>
#include <time.h>
#include <asm/unistd.h>

#define AS        200
#define BS        300
#define CS        500


float *a;
float *b;
float *c;


void* thread_routine(void* arg)
{
   int i,j;
   int index=*(int*)arg;
   float ret=0;
   printf("tid: %d   line: %d\n",syscall(__NR_gettid),index);
   for(i=0;i<CS;i++)
   {
     ret=0;
     for(j=0;j<BS;j++)
     {
       ret+=(*(a+index*BS+j))*(*(b+j*CS+i));
       *(c+index*CS+i)=ret;
     }
   }

   return;
}

int main()
{
        int i,j,k,l,m,n,o,p,q,r,s;
        float ret=0;
        pthread_t pt[200];
        int pi=0;        
        FILE* fp;
        time_t st,et;

        int count=0;
        a=(float*)malloc(4*AS*BS);
        if(a==NULL)
        {
          printf("memory error\n");
          return -1;
        }
        b=(float*)malloc(4*BS*CS);
        if(b==NULL)
        {
          printf("memory error\n");
          return -1;
        }
        c=(float*)malloc(4*AS*CS);
        if(c==NULL)
        {
          printf("memory error\n");
          return -1;
        }
        fp=fopen("toutput","w");
        printf("%p      %p       %p\n",a,b,c);
        for(i=0;i<AS;i++)
        {
                for(j=0;j<BS;j++)
                {
                        *(a+i*BS+j)=1.414*i*j;
                }
        }
        printf("a initialized\n");
        for(k=0;k<BS;k++)
        {
                for(l=0;l<CS;l++)
                {
                        *(b+k*CS+l)=1.414*k*l;
                }
        }

        printf("b initialized\n");
        for(m=0;m<AS;m++)
        {
                for(n=0;n<CS;n++)
                {
                        *(c+m*CS+n)=0;
                }
        }

        printf("After initializing\n");
        time(&st);
/*        for(o=0;o<AS;o++)
        {
            if(pthread_create(&pt[count],NULL,thread_routine,&count)!=0)
            {
              printf("can't make thread\n");
              return -1;
            }
           count++;
        }*/
o=0;  
while(o<AS)
   {
     pthread_create(&pt[count],NULL,thread_routine,&count);
     count++;
   }
  while(pi<AS)
  {
    pthread_join(pt[pi],NULL);
    pi++;
  }
  time(&et);
  printf("time taken %ld\n",et-st);
  for(p=0;p<AS;p++)
  {
    for(q=0;q<CS;q++)
    {
      fprintf(fp,"%f ",*(c+p*CS+q));
    }
    fprintf(fp,"\n");
  }
  fclose(fp);
  return 0;
}


위의 코드는 단순히 쓰레드를 시험하는 코드입니다.

for 루프 안에서 스레드를 생성하는데요.

논리상으로는 count가 하나 증가하고 그 값이 스레드의 인자로 들어가야 하는데

결과를 보면 스레드 id는 정상적으로 증가를 하나 count의 값을 제대로 받지 못합니다.

tid : 0                      index : 0
tid : 1                      index : 1
tid : 2                      index : 2
tid : 3                      index : 3

< 정상 결과 >

tid : 0                      index : 0
tid : 1                      index : 0
tid : 2                      index : 1
tid : 3                      index : 1

< 현재 결과 > - 인덱스의 증가를 제대로 받아오지 못하는군요.

스레드를 생성하는 부분에서 뭔가 잘못됐나요?

뮤텍스도 사용해봤습니다만... 잘 안되는군요...ㅠ.ㅠ

통합규정 1.3 이용안내 인용

"Pgr은 '명문화된 삭제규정'이 반드시 필요하지 않은 분을 환영합니다.
법 없이도 사는 사람, 남에게 상처를 주지 않으면서 같이 이야기 나눌 수 있는 분이면 좋겠습니다."
08/11/04 00:22
수정 아이콘
음.. posix thread인가요;; 제가 posix 쪽은 사용을 안해봐서 정확하게는 모르겠습니다만,
winapi thread와 비슷하게 동작한다는 가정 하에서 말씀을 드리자면...
index가 0,0,1,1... 이런 식으로 안나오고, 10, 10, 15, 15... 이런 식으로 나오게 될 것 같습니다.
count 값의 포인터를 넘겨주고 있는데요, 음... 근데, while(o<AS) 때문에 무한루프가 될듯? while(count<AS)가 맞겠죠??

뭐 어쨌거나, 그건 그렇다 치고, 스레드 생성 명령을 내리면, 보통 waitable 상태가 되기 전에는 context changing 현상 때문에,
thread routine이 즉각 동작하지 않고, main routine이 어느 정도 진행한 후에 실행되는게 보통입니다. 그게 문제인듯 싶네요.

일단, count의 포인터를 넘기지 마시고, int 값을 바로 넘기면 해결은 될 듯 합니다. 즉..
pthread_create(&pt[count],NULL,thread_routine,&count) 로 하지 마시고,
pthread_create(&pt[count],NULL,thread_routine,(void*)count) 로 하시면서, thread_routine 내부에서,
int index = (int)arg; 로 하시면 될 것 같습니다. 좀 억지스럽지만, 이렇게 많이들 합니다 ^^;;

정 그렇게 하는게 껄끄러우시면...
int *index_ptr = new int[AS];
index_ptr[count] = count;
pthread_create(&pt[count],NULL,thread_routine,&index_ptr[count]);
...
delete[] index_ptr;
이런식으로 구현하시거나요.
(근데, gcc 쓰시는 분들은 헝가리안 표기법을 잘 안쓰시는 경향이 있더라구요;; 왜그런지;;)
08/11/04 01:26
수정 아이콘
제가 보기에도 AhnGoon님의 말이 맞는것 같네요. 단지.. count값이 정상값보다 크게 나오지 않고 작게 나오는게 좀 이상하긴 하지만요.
그리고, pthread를 사용할 때 주의 할 점 중에 하나가, 포인터로 넘기실 때, stack에 있는 변수에 대한 포인터를 넘기는 것은 피하셔야
한다는 점인데요. 별 문제 없이 잘 동작하는 경우도 있지만, 경우에 따라서는 한 thread에서 다른 thread의 stack을 접근하지 못하는
경우도 있습니다.

단지 count를 넘기는게 목적이라면 AhnGoon님이 말씀하신 것 중 첫번째 방법을 쓰는게 좋을거 같네요.
(요즘 헝가리안 표기법은 거의 안 쓰이지 않나요? Java 스타일의 표기법이랑 unix 스타일의 표기법 두가지가 일반적으로 쓰이는 걸로 알고 있네요. 근데 어느 쪽을 쓰느냐 하는 것도 거의 종교적인 수준이라...)
MoreThanAir
08/11/04 02:03
수정 아이콘
아... 저 아래의 while(o<AS) 부분은 for루프가 안되길래 while로 고쳐서 테스트 해보고는 안 지운 부분입니다.
AhnGoon님 말씀대로 각 스레드마다 다른 주소공간을 사용하게 동적할당을 시킨 후에 인자로 넘기니까 해결이 되었습니다.

답변 주신 분들 감사드립니다~
목록 삭게로! 맨위로
번호 제목 이름 날짜 조회
44498 pthread 관련 잘 아시는 분 계신가요? [3] MoreThanAir1808 08/11/03 1808
44497 와우 얼라이언스 질문입니다. [10] 문근영2197 08/11/03 2197
44495 여자 생일선물 추천해주세요 [24] なるほど2823 08/11/03 2823
44494 지리산 당일치기 질문입니다. [8] 바람과쓰러지1509 08/11/03 1509
44493 나이키 에어포스 진품/가품 인지 알려주세요 [4] eros[zerg]3290 08/11/03 3290
44492 요즘 여자 고등학생들은 어떤 바람막이를 주로 입나요? [15] TOR[RES]2562 08/11/03 2562
44491 어제 소개팅 했는데요... [11] 하얀그림자2477 08/11/03 2477
44490 이성문제에 관련해서... [3] Wr.C-YuJI1707 08/11/03 1707
44489 혼다 "줌머" 중고 매매 관련 입니다. [3] 창천2233 08/11/03 2233
44488 마재윤 vs 김택용 곰TV MSL 때 인터뷰 영상(고화질) 구할 길 없나요 방패연2224 08/11/03 2224
44487 멍 빨리 빼는법 질문입니다. [5] 2008046311880 08/11/03 11880
44486 제가이번에 컴퓨터를하나장만할려고하는데요(조립식) [4] 리로스1928 08/11/03 1928
44483 궁금한게 두 가지 있습니다. [2] 행복하게살자1898 08/11/03 1898
44482 매틀랩 관련드려서 질문합니다. [7] H.B.K5371 08/11/03 5371
44480 e-sports문화에 대한 토론을 준비하려 합니다 [4] Dawintoss2102 08/11/03 2102
44479 LCD모니터 어떤게 좋을까요? [4] sekhmet2117 08/11/03 2117
44478 윈도우 XP 프로필 질문입니다. [1] Psidis1765 08/11/03 1765
44477 징병검사 관련 질문이에요 .. [2] 세느1523 08/11/03 1523
44476 Origin 7.5에 관해서 여쭙니다... H.B.K1812 08/11/03 1812
44475 어학연수에 관해 질문 좀 드릴께요 ^^; [4] 쮜방울1626 08/11/03 1626
44474 [컴퓨터]하드웨어 안전하게 제거 문제입니다. [2] proletaria2610 08/11/03 2610
44473 인터넷 이벤트 결제에 관한 질문입니다. [3] Ex-sports1902 08/11/03 1902
44472 2006 스카이 프로리그 그랜드파이널(SKT T1 vs MBC게임) 끝나고 온게임넷에서 만든 영상 구해요; [1] EsPoRTSZZang1929 08/11/03 1929
목록 이전 다음
댓글

+ : 최근 6시간내에 달린 댓글
+ : 최근 12시간내에 달린 댓글
맨 위로