Среда, 20 ноября 2019

c++ _beginthread 예제

70

새로운 프로그래밍 개념을 배우는 한 가지 좋은 방법은 다른 사람의 코드를 공부하는 것입니다. 잡지 기사에서 소스 코드를 찾을 수 있으며 CodeProject와 같은 사이트에서 인터넷에 게시할 수 있습니다. 나는 렉스 Jaeschke에 의해 C / C ++ 사용자 저널을 위해 작성 된 두 개의 기사에서 멀티 스레드 프로그램의 몇 가지 좋은 예를 우연히 만났다. 2005년 10월호에서 Jaeschke는 «C++/CLI 스레딩: 파트 1″이라는 제목의 기사를 썼고, 2005년 11월호에서는 «C++/CLI 스레딩: 파트 2″라는 제목의 후속 기사를 썼습니다. 불행 하 게도, C/C ++ 사용자 저널 잡지 접힌 이 기사 등장 직후. 그러나 원래 문서와 Jaeschke의 소스 코드는 다음 웹 사이트에서 계속 사용할 수 있습니다: _beginthreadex에 전달된 start_address의 루틴은 __stdcall(네이티브 코드의 경우) 또는 __clrcall(관리 코드의 경우) 호출 규칙을 사용해야 하며 반드시 사용해야 합니다. 스레드 종료 코드를 반환합니다. 스레드를 종료하는 방법에는 여러 가지가 있습니다. 그러나 권장되는 방법은 스레드가 실행하도록 지시된 함수를 종료하는 것입니다. 다음 예제에서는 스레드가 ID를 인쇄한 다음 종료합니다: 이 예제 프로그램은 Windows 2003 Server에서만 실행해야 하는 경우 64비트 정수(LONGLONG 데이터 형식)와 InterlockedIncrement64(InterlockedIncrement64)) 함수를 사용하기 위해 다시 작성할 수 있습니다. 그러나, 아아, 윈도우 XP는 인터로크를 지원하지 않습니다Increment64().

따라서 원래 32 비트 정수만 처리하는 Windows XP 프로그램에서 원자성 버그를 시연 할 수 없을 까봐 걱정했습니다. 그러나 흥미롭게도 릴리스 모드 설정이 아닌 Visual C++ .NET 컴파일러에서 디버그 모드 설정을 사용하는 한 이러한 버그를 시연할 수 있습니다. 따라서 내부의 다른 예제 프로그램과 달리 . 내가 배포 하는 ZIP 파일, 이 하나는 디버그 구성에 대 한 설정. _beginthread 또는 _beginthreadex를 사용하려면 응용 프로그램이 다중 스레드 C 런타임 라이브러리 중 하나와 연결되어야 합니다. _beginthread 함수는 start_address에서 루틴실행을 시작하는 스레드를 만듭니다. start_address의 루틴은 __cdecl(네이티브 코드의 경우) 또는 __clrcall(관리 코드의 경우) 호출 규칙을 사용해야 하며 반환 값이 없어야 합니다. 스레드가 해당 루틴에서 반환되면 자동으로 종료됩니다.

스레드에 대한 자세한 내용은 이전 코드에 대한 다중 스레딩 지원(Visual C++)을 참조하십시오. _beginthread()를 호출하는 것은 매개 변수를 적게 사용하고 스레드가 종료된 후 핸들을 정리하기 때문에 더 편리해 보이지만 _beginthreadex()를 사용하는 것이 좋습니다. LIBCMT에 연결된 실행 파일의 경우. LIB는 Win32 ExitThread() API를 호출하지 않습니다. 이렇게 하면 런타임 시스템에서 할당된 리소스를 회수할 수 없습니다. _endthread() 및 _endthreadex() 할당된 스레드 리소스를 회수한 다음 ExitThread()를 호출합니다. 운영 체제는 _beginthread() 또는 _beginthreadex()가 호출될 때 스택의 할당을 처리합니다. 스레드 스택의 주소를 이러한 함수 중 하나에 전달할 필요가 없습니다.