:: 게시판
:: 이전 게시판
|
이전 질문 게시판은 새 글 쓰기를 막았습니다. [질문 게시판]을 이용바랍니다.
통합규정 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 스타일의 표기법 두가지가 일반적으로 쓰이는 걸로 알고 있네요. 근데 어느 쪽을 쓰느냐 하는 것도 거의 종교적인 수준이라...)
08/11/04 02:03
아... 저 아래의 while(o<AS) 부분은 for루프가 안되길래 while로 고쳐서 테스트 해보고는 안 지운 부분입니다.
AhnGoon님 말씀대로 각 스레드마다 다른 주소공간을 사용하게 동적할당을 시킨 후에 인자로 넘기니까 해결이 되었습니다. 답변 주신 분들 감사드립니다~
|