스레드 동기화 이벤트 대상
블로거가 업무 중에 만나는 수요 중 하나가 이벤트 대상을 사용했다.프로젝트 요구 사항은 서버에 파일을 연속으로 보내는 것입니다.파일 서버를 보낼 때마다 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이면 익명의 이벤트 객체가 작성됩니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
스레드 동기화 - 핵심 코드 세그먼트텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.