안녕하세요.


쓰레드 동작관련하여 질문 있습니다.


쓰레드로 동작하는 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 settingn");
                        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 정도?) 출력됩니다. 슬립을 주게되면 두변수의 값이 같은것을 확인했습니다.  왜 슬립을 빼게 되면 다른 값이 출력되는지 궁금합니다.


번호 제목 글쓴이 날짜 조회 수
공지 [공지] 프로그래밍 관련 Q&A 게시판 입니다. woos 2016.04.09 22245
438 raw device에 random write를 보내고 싶습니다. ysh 2015.01.29 6268
437 커널 이미지가 올라가는 물리 메모리의 시작주소는 어디일까요? shepherd44 2015.01.07 1935
436 메모리 페이지 테이블에 관란 질문입니다.(TTBR0, TTBR1) 김영민 2014.12.16 2433
435 리눅스 커널 내부구조 소스 키보드 LED예제중 에러문제 천하무적주석 2014.12.11 1827
434 TX timestamp 관련 질문 정재훈 2014.11.04 2218
433 ioremap 관련해서 질문드립니다. [1] ysh 2014.10.29 2516
» 안녕하세요. 쓰레드에 관련하여 질문이 있습니다. 송창인 2014.10.22 1618
431 리눅스에서 지원하는 priority inheritance futex 에 대해서 질문입니다. CVE 2014.10.13 2327
430 mmap하여 read,write에 관한 질문입니다. [1] ysh 2014.10.08 2215
429 NAND ERASE 할 때 BLOCK 단위로 지우지 않는 방법 있을까요 ? [1] 최고운 2014.10.02 1813
428 atomic_read, atomic_add 시 interrupt disable, restore 가 필요한지.. [4] YYS 2014.10.02 3847
427 32bit 운영체제 resistor가 double형 변수처리하는 방법 구자경 2014.09.25 1576
426 안드로이드 포팅 질문드려요. [1] shepherd44 2014.09.18 2019
425 compressed/head.s 에서 LC0: 코드 관련 [1] erasmooth 2014.09.17 1853
424 "코드로 알아보는 ARM 리눅스 커널" 책에서...(초판 2쇄) erasmooth 2014.09.17 2314
423 boot.bin 파일을 부팅하는 usb를 만들고 싶습니다. 마고 2014.09.16 1835
422 리눅스에서 local APIC 타이머 레지스터 사용 질문드립니다. it876 2014.09.15 2108
421 __mmap_switched 레이블 전후로 PIC 에서 절대주소로 전환되는 원리 [1] erasmooth 2014.09.12 1880
420 qemu에 커널을 올릴 때 에러가 발생합니다. [3] ysh 2014.09.10 2170
419 시스템콜 대해서 질문좀 드려봅니다. [6] 장비익덕 2014.08.14 3973
XE Login