mfc waitformultipleobjects 예제

_beginthreadex()를 호출하는 것은 _beginthread()로 어려움을 피할 수 있습니다. 스레드가 종료되면 _beginthread()에 대한 호출로 반환된 핸들이 유효하지 않거나 다시 사용됩니다. 따라서 스레드의 상태를 쿼리하거나 스레드에 대한 핸들이 원래 가리키는 동일한 스레드의 핸들이라고 확신할 수 없습니다. 다음 예제에서는 _beginthreadex 호출을 호출하여 만든 스레드가 종료된 후에도 리소스를 계속 보유합니다. 이러한 리소스는 핸들의 CloseHandle() 함수를 스레드에 호출하여 해제해야 합니다. 다음 예제에서는 스레드를 만들고 완료될 때까지 기다렸다가 해당 리소스를 해제하는 전체 순서를 보여 줍니다. 아래 예제를 참조하십시오. 등록은 AddWaitWait 메서드를 통해 수행됩니다. 이 메서드는 두 개의 인수를 사용 합니다-대기 핸들 및 핸들 신호 때 호출 될 해당 처리기 함수입니다. 처리기 함수는 함수 개체로 제공되어야 합니다. 명시적으로 만든 함수 개체를 제공하거나 STL std::bind() 기능을 사용하여 즉시 구성할 수 있습니다. 이 두 가지 사용법은 모두 아래에 나와 있습니다: 각 스레드에는 자체 스택이 있습니다(스레드 대 프로세스 참조).

아래 예제에서 CreateThread() 함수의 2번째 인수인 stackSize 매개 변수를 사용하여 새 스레드 스택의 크기를 바이트로 지정할 수 있습니다. 이 정수 값이 0이면 스레드에는 만드는 스레드와 크기가 같은 스택이 제공됩니다. 다중 스레드 환경에서 각 스레드에는 고유한 로컬 스레드 스택 및 레지스터가 있습니다. 여러 스레드가 읽기 및 쓰기를 위해 동일한 리소스에 액세스하는 경우 값이 올바른 값이 아닐 수 있습니다. 예를 들어 응용 프로그램에 파일에서 콘텐츠를 읽기 위한 스레드와 파일을 작성하는 스레드가 두 개의 스레드가 있다고 가정해 보겠습니다. 쓰기 스레드가 쓰기를 시도하고 읽기 스레드가 동일한 데이터를 읽으려고 하면 데이터가 손상될 수 있습니다. 이 경우 파일 액세스를 잠급하려고 합니다. 스레드 동기화에는 두 단계가 있습니다.

신호 및 비 신호. _beginthreadex()를 사용하는 다음 예제는 이전 코드와 동일합니다. _beginthreadex()에 의해 생성된 스레드는 CloseHandle()을 호출하여 정리해야 합니다. 따라서 WaitForSingleObject()에 대한 호출은 올바른 핸들을 얻을 수 있습니다: 위의 예에서 m_socket1 및 m_socket2와 연결된 Win32 이벤트는 AsyncSocket 메서드 ReadIncomingPacket에서 직접 처리됩니다. 이 메서드는 std::bind()를 사용 하 여 함수 개체로 변환 됩니다. 그러나 m_socket3은 명시적으로 정의된 함수 개체인 AnotherEventHandler에서 처리합니다. 고정 형식 시그니처의 함수/메서드 포인터 대신 함수 개체를 사용하면 유연성이 매우 커합니다. 대기 핸들 처리기로 바인딩할 수 있는 메서드 또는 해당 인수의 형식에 대한 제한은 거의 없습니다. 이러한 메서드는 WFMOHandler의 자식뿐만 아니라 모든 클래스에서 올 수 있습니다. 이는 위의 예제에서 보여 주며 소켓 이벤트 처리기가 AsyncSocket:ReadIncomingPacket로 설정됩니다.

Uncategorized