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님 말씀대로 각 스레드마다 다른 주소공간을 사용하게 동적할당을 시킨 후에 인자로 넘기니까 해결이 되었습니다.

답변 주신 분들 감사드립니다~
목록 삭게로! 맨위로
번호 제목 이름 날짜 조회
44526 언제까지.. [23] 쿠샤2598 08/11/04 2598
44525 여행용 가방 추천부탁드립니다. [2] Vacant Rain2187 08/11/04 2187
44524 PGR 엑셀 신들에게 다시 질문 올립니다~ [2] 고드헨드1504 08/11/04 1504
44523 vhdl 고수님 있으시면 답변좀 해주세요 잘못된게 있어서요 AnyCall[HyO]김상1820 08/11/04 1820
44522 PGR 엑셀 신들에게 질문드려요~~ [3] 고드헨드1623 08/11/04 1623
44521 RFID에 대해서 잘 아시는분 있나요 [1] 야생올챙이1563 08/11/04 1563
44520 우체국등기실수 [4] 수달포스2196 08/11/04 2196
44519 PGR 엑셀 신들에게 질문드립니다. [6] 고드헨드2196 08/11/04 2196
44516 노트북으로 스타하는중 자꾸 밖으로 튕깁니다. [5] chacha2110 08/11/04 2110
44515 컴퓨터 견적 부탁드립니다;; [11] 청새치1873 08/11/04 1873
44513 E-SPORTS계 최고의 명문팀은 어디일까요?? [7] 홍연아!제발...2113 08/11/04 2113
44512 psp구입질문이요.. [4] 이진우1830 08/11/04 1830
44511 작용 반작용에 대한 뻘질문입니다. [7] S_Kun2138 08/11/04 2138
44508 컴퓨터관련 질문입니다. [4] Enjoy1620 08/11/04 1620
44507 이 프로리그 BGM 노래 제목 좀 알려주세요 [2] Bikini1957 08/11/04 1957
44505 신발 질문입니다! [16] 산들바람2169 08/11/04 2169
44504 이차원 배열 동적할당 질문입니다. [5] Nocoment1942 08/11/04 1942
44503 STL로 스택구현을 어떻게 해야 할까요... [2] EZrock2120 08/11/04 2120
44502 연애 관련 상담입니다^^: [14] 스타2나와랏2426 08/11/04 2426
44501 남해안쪽 펜션이나 민박 질문입니다. [3] 도시의미학2849 08/11/04 2849
44500 경북 경산시 경산중 · 고등학교에 가려고 합니다.(2009학년도 임용시험 장소) [6] Trademark-G2179 08/11/03 2179
44499 주식용어 질문합니다 [5] 라르쿠1564 08/11/03 1564
44498 pthread 관련 잘 아시는 분 계신가요? [3] MoreThanAir1820 08/11/03 1820
목록 이전 다음
댓글

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