2010-05-17 4 views
4

나는 다음 있습니다.이상한 C++ 스레드 함수 호출

스레드에서 호출되는 함수가 캐스트 this 포인터를 통해 호출되는 이유는 무엇입니까? 이 좋은 습관인가?

직접 호출 할 수 없습니까?

실행해야하는 실제 함수는 파생 클래스에 있습니다.

내 질문은

+2

귀하의 질문은 ...? – Anthony

+0

스레드에서 호출되는 함수가 캐스트를 통해 호출되는 이유는 무엇입니까? 이 좋은 습관인가? 직접 호출 할 수 없습니까? –

+1

정적 멤버 함수에는 "this"가 없습니다. – eemz

답변

2

대부분의 플랫폼 수준 스레드 API는 베어 본 (bare-bone) C이며 새 스레드에서 실행되는 함수에 대한 일반 포인터를 사용합니다. 이것은 C++에서 함수가 자유 함수이거나 정적 멤버 여야한다는 것을 의미합니다. 이 둘 모두 어떤 클래스 인스턴스에 대한 액세스도 제공하지 않습니다. statefull 쓰래드 클래스를 구현하는 방법은 쓰래드 생성 호출의 추가 "통과"인자를 이용하는 것이다. (보통 새로운 쓰레드에서 실행 된 함수에 나중에 전달되는 포인터이다.) 클래스 자체에 대한 포인터를 준다. 즉 this입니다. 그런 다음 정적 함수는 [가상] 멤버, 예를 들어 run() 또는 그와 비슷한 것을 호출 할 수 있습니다.

3

스레드 기능이 '클래스 인식'이 아닙니다. 당신의 구현은 파생 된 'run'함수가 클래스 멤버에 액세스 할 수 있도록 클래스를 인식하게합니다.

1

_beginthreadex 함수는 C 함수입니다. 그것은 C++에 대해 아무 것도 모른다. 스레드 함수 내에서 C++ 멤버에 액세스하려면이를 캐스팅해야합니다.

4

_beginthreadex은 (stdcall) C 스타일 함수를 필요로하므로 C++에 대한 지식이 없으므로 C++ 멤버 함수를 사용할 수 없습니다. 멤버 함수를 실행하는 방법은 객체에 대한 포인터를 전달하고 그 함수 내에서 멤버 함수를 호출하는 것입니다. 이러한 기능을 종종 트램펄린이라고합니다.