resumethread 예제
다음 코드는 이전 코드와 동일합니다. 그러나이 예제는 WaitForMultipleObjects()를 사용하고 있습니다. 나에게 일어난 마지막 아이디어는 CSRSS라는 시스템 프로세스를 사용하는 것이었습니다. 콘솔 창 이벤트를 처리하는 방법에 의해 발생하는 EXE 및 일부 부작용. 콘솔 응용 프로그램은 운영 중인 창의 이벤트, 모양 및 동작에 대한 액세스가 매우 제한되어 있기 때문에 클라이언트/서버 런타임 하위 시스템[11] 분해물 분해를 살펴봐야 합니다. winsrv.dll 모듈, 생성, 파괴 및 콘솔의 표준 메시지를 처리에 대한 책임. 내 아이디어는 간단한 관찰을 기반으로합니다 – 사용자가 콘솔을 다른 모드로 전환하기로 결정할 때 (예 : 마크 옵션 사용), 정상 모드가 복원 될 때까지 활성 콘솔 버퍼에 대한 액세스가 비활성화됩니다. 위의 모든 c 런타임 라이브러리 함수는 process.h 헤더 파일에 있습니다. Microsoft Visual Studio 프로젝트 설정이 다중 스레드 DLL인지 확인합니다.
_beginthread 및 _beginthreadex 함수는 C 런타임 라이브러리에서 스레드를 만드는 데 사용됩니다. 그러나 이러한 함수에는 몇 가지 차이점이 있습니다. _beginthreadex에는 보안 및 스레드 주소와 같은 이내 매개 변수가 추가됩니다. _beginthread를 사용하여 스레드를 만들 때 스레드는 _endthread를 사용합니다. _endthread스레드 핸들을 자동으로 닫습니다. 그러나 _endthreadex를 사용하면 CloseHandle Win32 API 함수를 사용하여 nthread 핸들을 닫습니다. C 런타임 라이브러리에는 내부적으로 스레드 로컬 저장소(TLS)가 포함되어 있습니다. API 또는 컴파일러 특정 코드를 사용하여 스레드 로컬 저장소를 사용할 수 있습니다. TlsAlloc, TlsFree, TlsGetValue 및 TlsSetValue는 스레드 특정 데이터를 저장하는 데 사용됩니다. C 런 타임 라이브러리에 _beginthread 함수를 사용하는 경우 ExitThread 또는 CreateThread와 같은 Win32 API를 사용할 수 없습니다. 왜냐하면 해당 메서드를 사용하면 교착 상태가 발생할 수 있기 때문입니다.
_beginthread는 스레드 만들기에서 여러 인수를 사용합니다. 우리의 예제 프로그램은 간단한 콘솔 기반 응용 프로그램입니다. 사용자가 만들 스레드 수를 입력한 다음 각 스레드를 실행합니다. 스레드를 종료하는 방법에는 여러 가지가 있습니다. 그러나 권장되는 방법은 스레드가 실행하도록 지시된 함수를 종료하는 것입니다. 다음 예제에서는 스레드가 ID를 인쇄한 다음 종료됩니다: 예를 들어, Solaris SPARC(__SPARC), Solaris x86(__X86) 및 Linux x86(__LINUXX86)에 대한 SIGSEGV 처리기에서 페이지 오류 정보가 다음과 같은 방법으로 추출됩니다. _beginthreadex()는 이전 코드와 동일합니다. _beginthreadex()에 의해 생성된 스레드는 CloseHandle()을 호출하여 정리해야 합니다.