>백엔드 개발 >C++ >pthread에서 C 클래스 멤버 함수를 어떻게 사용할 수 있습니까?

pthread에서 C 클래스 멤버 함수를 어떻게 사용할 수 있습니까?

Barbara Streisand
Barbara Streisand원래의
2024-12-23 04:29:20335검색

How Can I Use C   Class Member Functions in pthreads?

클래스 멤버 함수를 스레드에 통합

C에서 클래스 멤버 함수는 본질적으로 "this"라는 숨겨진 매개변수를 전달합니다. 이는 표준 라이브러리의 pthread_create() 함수가 그러한 매개변수 없이 함수 포인터를 기대하기 때문에 멤버 함수를 사용하여 스레드를 생성하려고 할 때 문제를 야기합니다.

컴파일 오류: 함수 포인터를 변환할 수 없습니다

초기 코드 조각에서 알 수 있듯이 pthread_create()에 클래스 멤버 함수를 전달하려고 하면 컴파일이 직접 발생합니다. error:

pthread_create(&t1, NULL, &c[0].print, NULL);

컴파일러는 멤버 함수 포인터(void* (tree_item::*)(void*))를 예상되는 함수 포인터 유형(void* (*)(void)으로 변환할 수 없다고 불평합니다. *)).

해결 방법: 정적 클래스 메서드 또는 독립 함수

회피하려면 이 문제에는 두 가지 실행 가능한 접근 방식이 있습니다.

  1. 정적 클래스 메서드:
    정적 클래스 메서드 정의("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();
        }
    };
  2. 독립 함수:
    클래스 멤버 함수 주변의 래퍼 역할을 하는 별도의 함수를 만들고 "this"를 명시적으로 전달합니다. " 포인터를 인수:

    void hello_wrapper(void *context)
    {
        C *object = (C *)context;
        object->print();
    }

정적 클래스 메서드 또는 래퍼 함수를 ​​사용한 스레드 생성

이러한 접근 방식 중 하나를 사용하면 이제 pthread_create( ) 원하는 클래스 멤버 함수를 실행할 스레드를 생성하려면:

C c;
pthread_create(&amp;t, NULL, &amp;C::hello_helper, &amp;c);  // Static Class Method

pthread_create(&amp;t, NULL, &amp;hello_wrapper, &amp;c);  // Wrapper Function

위 내용은 pthread에서 C 클래스 멤버 함수를 어떻게 사용할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.