thread생성시에요..
글쓴이: yurina / 작성시간: 월, 2004/05/10 - 4:42오후
while(1) { pthread_mutex_lock(&mutex_lock); memset(&message, 0x00, SZ_MESSAGE); if(read(tempfd, &message, SZ_MESSAGE) <= 0) break; /*----------------------------------------------*/ /* Create Thread */ /*----------------------------------------------*/ message.user_fd = tempfd; rtn = pthread_create(&p_thread, NULL, send_message, (void *)&message); if(rtn < 0) { _debug(_fl, "thread create error resockfd[%d]\n", resockfd); exit(1); } pthread_detach(p_thread); pthread_mutex_unlock(&mutex_lock); sleep(1); <=== 이걸 안주면 memset이 먼저 되어 값이 안옵니다. }
void *send_message (void *data) { int option=0, resockfd=0; int login_qid=0, result=0; struct MESSAGE message; struct USER_INFO user; struct ROOM_INFO room; _debug(_fl, "========== create thread==========\n"); memset(&message, 0x00, SZ_MESSAGE); memcpy(&message, (struct MESSAGE *)data, SZ_MESSAGE); printf("________-[%.2s][%.16s/%.10s][%c][%c]\n", message.option, message.user_id, message.user_name, message.user_sex, message.categorize1); }
====================================
문제는요...thread create까지는 잘되는데요..send_message에서
memcpy(&message, (struct MESSAGE *)data, SZ_MESSAGE);
하기전에...스레드를 생성하는 while문의
memset(&message, 0x00, SZ_MESSAGE);
이부분이 먼저 수행되어서..값을 가져오지 못합니다...
음...값을 가져오기전에 memset을 시키니 말입니다.
그래서 mutex처리두 해봤는데 안되구요...
지금은 while문 안에 sleep을 주면 잘되가는 상황입니다만...
sleep을 안주고 하는 방법은 없을까요?
Forums:
안녕하세요.. 조금 구조가 이해가 잘되지 않습니다만..Queue를
안녕하세요.. 조금 구조가 이해가 잘되지 않습니다만..
Queue를 이용하시면 될것같습니다..
구조상문제겠지만.. 쓰레드 두개가 있고 한놈은 만들었다지웠다하고..
한놈은 가져가는일을 반복한다면 race condtion 이 발생하지요..
타이밍이 맞아야 가져올수있습니다.. Queue를 이용하셔서 쌓고
사용한 데이타는 지우는 방법을 채택하시던가 아니면..
데이터가 사용되기전엔 blocking되게 하는 함수를 만드세요..
데이터가 처리가 된후 memset이 필요하다면 데이터가 처리된놈인지
체크하는 flag도 필요할것 같습니다.
두서가 없는말같아 죄송합니다 ㅡㅡa 배가고파서..
꼭한번씩 send_message를 타야하는 데이터인지 아닌지가 중요하겠군요..
원하는 처리방법에대해 좀더 설명이 필요할것같습니다.
' 형식이 내용을 규정한다. '
[code:1]memset(&message, 0x0
로하면 되지 않을까요 뭐 좀 무식해보이긴하지만 ㅡㅡa
화면이 작아서 잘모르겠네 제대로 한건지 -_-
' 형식이 내용을 규정한다. '
세마포어 사용해보세요.
세마포어를 사용하세요.
자세한 내용은 man 찾아보세요.
뮤텍스는 단지 동시 접근을 못하게 하는 것이어서 이와 같은 상황에서 사용하기엔 안맞습니다.
ps. 별로 큰 이상은 없을 것 같습니다만 마지막의 sem_destroy와 sem_post에서 조심해야겠네요.
짜놓구보니 역시나 무식하고..쓰레드를 쓰는 목적을 찾을수 없어보이
짜놓구보니 역시나 무식하고..
쓰레드를 쓰는 목적을 찾을수 없어보이는군요..
죄송합니다. ㅡㅡa
역시나 Queue를 이용하시는걸 추천합니다.. 아니면..
좀더 구조에대해 공부가 필요하실것 같습니다..
' 형식이 내용을 규정한다. '
Re: thread생성시에요..
무식하지만 꽁수인데여..
쓰레드의 파라미터로 넘길 데이터를 새로 만들어서 보내는거져..
unsigned char* data=malloc(데이터크기)
data의 길이는 항상 MESSAGE Structure로 일정하니까 길이는 안쓰셔도 되겠구여
아니면 데이터의 길이가 가변적이라면
unsinged char* data=malloc(데이터 길이+데이터 크기)
data의 앞부분에 데이터의 길이를넣고 그다음에 데이터크기를 넣는식으로
할수도 있겠쪄
물론 메모리 free는 Thread에서 해주셔야져..
실제로 제가 이렇게 쓰고있읍니다..꽁수지만.
댓글 달기