안녕하세요. 리눅스 쓰레드에 관련하여 질문이 있습니다.
안녕하세요.
쓰레드 동작관련하여 질문 있습니다.
쓰레드로 동작하는 receive 함수를 구현하여, 패킷을 받을 때 마다 받은 패킷을 카운팅 하였고, 받은 패킷의 구조체에 또 다른
변수를 받을 때 마다 더하는 카운트 변수가 존재하는데 결과 출력시 서로 다른 값을 출력하는 것을 확인 했습니다.
이상하게 sleep을 주면 같은 같은 출력하게 되는데 sleep만 빼게 되면 서로 다른 값을 출력하네요 ...
아직 실력이 부족해 여기에 글을 남겨 봅니다. 고수님들의 조언 부탁드립니다.
글로 설명 드리기 애메하여 아래의 코드를 첨부합니다. 감사합니다.
while(1){
Restart_Receive:
FD_ZERO(&rfd);
FD_SET(Ftnet.fd, &rfd);
if(select(Ftnet.fd+1, &rfd, 0, 0, &tv) < 0){
printf(" error select setting\n");
exit(0);
}
now_time = time((time_t)0L);
info_time = localtime(&now_time);
current_time = info_time->tm_min;
while(data_size = recvmsg(Ftnet.fd, (struct msghdr*)&Ftnet.msg, 0) > 0){
pdu_v5 = (struct ftpdu_v5*)&Ftpdu.buf;
//데이터 분석후 해시테이블에 저장
// pthread_mutex_lock(&Lock_Syc);
Create_HashData(pdu_v5, Rev_Data, info_time);
Insert_Hash(Rev_Data, Hash_Table);
listen_packet++; ///////// <- send에서 보내는 패킷을 카운팅하는 변수
// pthread_mutex_unlock(&Lock_Syc);
}
if(current_time == 60 || old_time == 60){
if( current_time == 60){
current_time = 0;
}else if(old_time == 60){
old_time = 0;
}
}
if(current_time == old_time){
goto Restart_Receive;
}else{
old_time = current_time;
goto Send_Sig;
}
}
//1분마다 해시 테이블 memcpy
Send_Sig:
pthread_mutex_lock(&Lock_Syc);
Total_Rcv_Packet = listen_packet;
pthread_cond_signal(&Cond_Sig);
pthread_cond_wait(&Cond_Sig, &Lock_Syc);
// listen_packet = 0;
pthread_mutex_unlock(&Lock_Syc);
listen_packet = 0;
// sleep(1);
goto Restart_Receive;
}
Insert_Hash() 함수 내에서 패킷을 하나 받을 때마다 node->counter += 1;를 수행
즉 위의 스레드에서 listen_packet 값과 node->counter 값이 같아야하는데 슬립을 빼게 되면 미묘하게 다른 값이(오차 -5 ~ +5 정도?) 출력됩니다. 슬립을 주게되면 두변수의 값이 같은것을 확인했습니다. 왜 슬립을 빼게 되면 다른 값이 출력되는지 궁금합니다.
댓글 달기