스레드 동기화 이벤트 대상

이벤트 대상은 두 가지 다른 유형이 있는데 그것이 바로 인공적으로 리셋된 이벤트 대상과 자동으로 리셋된 시간이다.인공적으로 리셋된 이벤트 대상이 알림을 받았을 때, 이 이벤트 대상을 기다리는 모든 라인이 호출 가능한 라인으로 변합니다.자동으로 리셋된 대상이 알림을 받을 때, 시간 변경 대상을 기다리는 라인 중 하나만이 스케줄링 라인으로 바뀐다.
블로거가 업무 중에 만나는 수요 중 하나가 이벤트 대상을 사용했다.프로젝트 요구 사항은 서버에 파일을 연속으로 보내는 것입니다.파일 서버를 보낼 때마다 id를 생성하여 서버에 되돌려줍니다.그러나 클라이언트의 발송과 서비스 측의 회답은 비동기적인 방식을 채택하기 때문에 문제가 발생할 수 있다. 만약에 순환 연속으로 파일을 보내면 서버 측이 반드시 발송한 순서에 따라 id를 되돌려주는 것은 아니다. (서버 측이 상응하는 처리를 할 수도 있지만 우리는 오류를 모두 다른 사람에게 맡겨서는 안 된다. 다른 사람이 오류가 발생하는 것을 최대한 피해야 한다).이때 우리는 이 상황의 발생을 피하기 위해 시간 대상을 사용할 수 있다.
루프 전송 코드는 다음과 같습니다.
     HANDLE hSemaphore;
     hSemaphore = CreateEvent(NULL,TRUE,FALSE,NULL);
     for(int m_iIndex=0;m_iIndex<m_vSendFileInfo.size();m_iIndex++)
     {
        string surl,stype; 
        stype = "DOCUMENT";      
        surl = "https://test.sendfile.io";   
        CRestHttpClient msgurl(surl);
        msgurl.addParmas("filename",m_vSendFileInfo[m_iIndex].filename);
        msgurl.addParmas("length",m_vSendFileInfo[m_iIndex].length);
        msgurl.addParmas("type",stype);
        msgurl.DoPut(CBUploadFile,sFileInfo,m_vSendFileInfo[m_iIndex].sFilePath);
        string sTipText = " :" + m_vSendFileInfo[m_iIndex].filename;
        WaitForSingleObject(hSemaphore, 10000);
        ResetEvent(hSemaphore);
     }
수신단은 회답을 받은 후 SetEvent(hSemaphore)를 받으면 된다.이렇게 하면 비동기 통신에서 동기화 시간을 시뮬레이션할 수 있다.
다음은 사용된api에 대한 설명입니다.
CreateEvent 함수는 다음과 같이 이름 또는 익명의 시간 객체를 만들거나 엽니다.
       HANDLE  CreateEvent(LPSECURITY_ATTRIBUTES lpEventAttributes,                                              BOOL  bManualReset,
                                              BOOL  bInitialState,
                                              LPCTSTR   lpName);
lpEventAttributes가 SECURITY를 가리키는ATTRIBUTES 구조체의 포인터입니다.값이 NULL이면 기본 보안이 사용됩니다.
bManualReset, 생성된 인동 리셋 이벤트 대상을 지정하거나 이벤트 대상을 자동으로 리셋합니다.만약 이 매개 변수가 TRUE라면, 이 함수는 인공 리셋 이벤트 대상을 만들 것입니다.이 매개변수가 FALSE인 경우 함수에 자동 재설정 이벤트 객체가 생성됩니다.만약에 이벤트 대상을 인공적으로 리셋하면 라인이 이 대상의 소유권을 기다린 후에 ResetEvent 함수를 호출하여 수동으로 이 이벤트 대상을 무신호 상태로 설정해야 한다.이벤트 대상을 자동으로 리셋하면, 이 함수의 소유권을 기다린 후, 시스템은 자동으로 이 대상을 무신호 상태로 설정합니다.
bInitialState는 이벤트 객체의 초기 상태를 지정합니다.만약 이 매개 변수의 값이 진짜라면, 이 이벤트 대상은 처음에 신호 상태가 있습니다.그렇지 않으면 무신호 상태다.이 프로그램에서 우리는false로 설정하여 WaitForSingleObject 함수에 처음 실행되었을 때 멈추고 서버가 되돌아온 후에 이벤트를 신호상태로 설정해야만 아래로 계속 진행할 수 있음을 나타냅니다.
lpName 은 객체의 이름을 지정합니다.이 매개변수 값이 NULL이면 익명의 이벤트 객체가 작성됩니다.

좋은 웹페이지 즐겨찾기