pthread_create() 에서 thread argument를 넘겨줄때...
글쓴이: idrukawa / 작성시간: 수, 2013/06/12 - 1:32오후
pthread_create() 에서 thread argument를 넘겨줄때 void* 형으로 넘겨주도록 되어 있는데요.
만약에 pthread_create를 호출하고 바로 종료되는 함수에서
그 함수의 지역변수를 인자로 넘겨주려고 하면 문제가 됩니다.
아래의 경우처럼요.
void* thr_func( void* Arg ) { char Buf[1024]; strncpy( Buf, (char*)Arg, 1024 ); printf( "Buf: %s", Buf ); return NULL; } init_thr() { char Tmp[]="test string"; pthread_create( THR_IDX, 0, thr_func, (void*)Tmp ); // sleep(1); return 0; }
thr_func()에서 인자를 꺼내올 동안
init_thr()이 종료되지 안도록 sleep(1)을 주면 제대로 꺼내오는데
sleep(1)이 없으면 다른 데이터가 덮어써지는 경우가 있습니다.
sleep()은 임시 방편인것이고...
그렇다고 이 지역변수 char Tmp[]를 static으로 지정해주는것도 아닌것 같구요.
전역변수로 할바에는 인자로 넘겨줄 필요도 없구요.
적합한 해결방법이 무었인지 도움 요청합니다.
Forums:
이런걸 원하는 건가요?
---------------------------------------------
git init
git add .
git commit -am "project init"
---------------------------------------------
sleep 대신에 pthread_join을 사용해 보세요.
냉무
www.gilgil.net
제가 예제로 든 코드에서는 그렇게
제가 예제로 든 코드에서는 그렇게 안적었지만...
스레드함수(thr_func)는 실제 while로 동작하는 task입니다.
즉, 계속 무언가 자신의 작업을 수행하고 있는 녀석입니다.
init_thr()에서 pthread_join()을 쓰면 init_thr() 이 반환되지 않는 상태일 것입니다.
join은 main()에서 쓰고 있습니다.
즉 아래와 같은 구조라고 생각하시면 됩니다.
char Tmp[]="test string"; 을
char Tmp[]="test string"; 을 main() 함수의 지역변수로 정의하고
Tmp를 init_thr()함수에 다시 전달하는 방법도 있을 수 있겠네요.
From:
*알지비 (메일: rgbi3307(at)nate.com)
*커널연구회(http://www.kernel.bz/) 내용물들을 만들고 있음.
*((공부해서 남을 주려면 남보다 더많이 연구해야함.))
주소를 인자로 넘기고 싶다면 지역변수의 주소값이
주소를 인자로 넘기고 싶다면 지역변수의 주소값이 피하는건 당연해 보입니다.
문자열을 넘기고 싶다면 이렇게 하는건 어떨까요?
그리고, 인자 타입이 void * 이지만 값을 넘기고 싶다면 값을 넘기면 됩니다. 아래 처럼 말이죠.
thr_func 스레드 함수의 시작 부분에서
thr_func 스레드 함수의 시작 부분에서 Tmp("test string") 값을 참조해야 하는데 init_thr 함수가 종료되면 Tmp 객체가 해제되기 때문에 발생하는 에러로 보이네요.
thr_func 함수에서 printf 코드가 실핼될 때까지는 Tmp 객체가 해제되지 않도록 event 처리를 해 주시기 바랍니다(mutex랑 wait condition 사용).
www.gilgil.net
malloc
malloc
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://cinsk.github.io/cfaqs/
댓글 달기