c++ waitforsingleobject 예제

Sem imagem cadastrada

다음 코드는 이전 코드와 동일합니다. 그러나이 예제는 WaitForMultipleObjects()를 사용하고 있습니다. 다중 스레드 환경에서 각 스레드에는 고유한 로컬 스레드 스택 및 레지스터가 있습니다. 여러 스레드가 읽기 및 쓰기를 위해 동일한 리소스에 액세스하는 경우 값이 올바른 값이 아닐 수 있습니다. 예를 들어 응용 프로그램에 파일에서 콘텐츠를 읽기 위한 스레드와 파일을 작성하는 스레드가 두 개의 스레드가 있다고 가정해 보겠습니다. 쓰기 스레드가 쓰기를 시도하고 읽기 스레드가 동일한 데이터를 읽으려고 하면 데이터가 손상될 수 있습니다. 이 경우 파일 액세스를 잠급하려고 합니다. 스레드 동기화에는 두 단계가 있습니다. 신호 및 비 신호. _beginthreadex()를 호출하는 것은 _beginthread()로 어려움을 피할 수 있습니다. 스레드가 종료되면 _beginthread()에 대한 호출로 반환된 핸들이 유효하지 않거나 다시 사용됩니다. 따라서 스레드의 상태를 쿼리하거나 스레드에 대한 핸들이 원래 가리키는 동일한 스레드의 핸들이라고 확신할 수 없습니다. 다음 예제에서는 이 문제를 보여 줍니다: 또한 TThread.Synchronize를 사용 하 여 스레드 동기화의이 모델-여전히 거의 모든 델파이 책및 온라인 리소스에서 가르쳐.

그리고 많은 사용 사례에서 근본적으로 불가능한 일입니다. 이것은 실제로 그 파손의 한 예일 뿐입니다. 다음 예제에서는 세 가지 방법으로 스레드를 만듭니다. 그러나 권장되는 방법은 스레드가 실행하도록 지시된 함수를 종료하는 것입니다. 다음 예제에서는 스레드가 ID를 인쇄한 다음 종료합니다. 이러한 리소스는 핸들의 CloseHandle() 함수를 스레드에 호출하여 해제해야 합니다. 다음 예제에서는 스레드를 만들고 완료되기를 기다린 다음 리소스를 해제하는 전체 순서를 보여 줍니다: Windows XP, Windows Server 2003, Windows Vista, Windows 7, Windows Server 2008 및 Windows Server 2008 R2: dwMilliseconds 값에는 저전력 상태에서 보낸 시간이 포함됩니다. 예를 들어 컴퓨터가 절전 모드인 동안 시간 정수는 계속 카운트다운됩니다. 각 스레드에는 고유한 스택이 있습니다(스레드 대 프로세스 참조). 아래 예제에서 CreateThread() 함수의 2번째 인수인 stackSize 매개 변수를 사용하여 새 스레드 스택의 크기를 바이트로 지정할 수 있습니다. 이 정수 값이 0이면 스레드에는 만드는 스레드와 크기가 같은 스택이 제공됩니다.

WaitForSingleObject의 가장 큰 이점 또는 사용은 많은 스레드가 사용되고 모든 스레드가 완료되었는지 추적할 필요가 있을 때입니다. 예를 들어 닫는 동안 프로그램이 있을 수 있으며 모든 스레드를 종료하고 모든 파이프, 소켓 등을 중단하지 않고 합법적으로 닫아야 할 수 있습니다.