클래스 멤버 함수를 스레드에 통합
C에서 클래스 멤버 함수는 본질적으로 "this"라는 숨겨진 매개변수를 전달합니다. 이는 표준 라이브러리의 pthread_create() 함수가 그러한 매개변수 없이 함수 포인터를 기대하기 때문에 멤버 함수를 사용하여 스레드를 생성하려고 할 때 문제를 야기합니다.
컴파일 오류: 함수 포인터를 변환할 수 없습니다
초기 코드 조각에서 알 수 있듯이 pthread_create()에 클래스 멤버 함수를 전달하려고 하면 컴파일이 직접 발생합니다. error:
pthread_create(&t1, NULL, &c[0].print, NULL);
컴파일러는 멤버 함수 포인터(void* (tree_item::*)(void*))를 예상되는 함수 포인터 유형(void* (*)(void)으로 변환할 수 없다고 불평합니다. *)).
해결 방법: 정적 클래스 메서드 또는 독립 함수
회피하려면 이 문제에는 두 가지 실행 가능한 접근 방식이 있습니다.
정적 클래스 메서드:
정적 클래스 메서드 정의("this" 포인터를 허용하지 않음) 원하는 것을 캡슐화하는 것 기능:
class C { public: void *hello(void) { std::cout << "Hello, world!" << std::endl; return 0; } static void *hello_helper(void *context) { return ((C *)context)->hello(); } };
독립 함수:
클래스 멤버 함수 주변의 래퍼 역할을 하는 별도의 함수를 만들고 "this"를 명시적으로 전달합니다. " 포인터를 인수:
void hello_wrapper(void *context) { C *object = (C *)context; object->print(); }
정적 클래스 메서드 또는 래퍼 함수를 사용한 스레드 생성
이러한 접근 방식 중 하나를 사용하면 이제 pthread_create( ) 원하는 클래스 멤버 함수를 실행할 스레드를 생성하려면:
C c; pthread_create(&t, NULL, &C::hello_helper, &c); // Static Class Method pthread_create(&t, NULL, &hello_wrapper, &c); // Wrapper Function
위 내용은 pthread에서 C 클래스 멤버 함수를 어떻게 사용할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!