>백엔드 개발 >C++ >벡터에서 호출되는 C 클래스 멤버 함수에 대한 스레드를 만드는 방법은 무엇입니까?

벡터에서 호출되는 C 클래스 멤버 함수에 대한 스레드를 만드는 방법은 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-12-25 19:53:12855검색

How to Create Threads for C   Class Member Functions Invoked from a Vector?

클래스 멤버 함수에 대한 스레드 생성

문제:

다음과 같은 경우 클래스 멤버 함수에 대한 스레드를 어떻게 생성합니까? 함수는 클래스의 벡터에서 호출됩니다. 인스턴스?

예제 코드 및 오류:

다음 코드를 고려하세요.

class c {
    void *print(void *) { std::cout << "Hello"; }
};

std::vector<c> classes;
pthread_t t1;

classes.push_back(c());
classes.push_back(c());

// Attempt to create a thread for c.print()
pthread_create(&t1, NULL, &c[0].print, NULL);

// Error: "cannot convert 'void* (tree_item::*)(void*)' to 'void* (*)(void*)'"

설명:

C 클래스 멤버 함수에 전달된 암시적 this 매개변수가 있기 때문에 오류가 발생합니다. 내부적으로. 그러나 pthread_create()는 이 숨겨진 매개변수를 처리하지 않으므로 멤버 함수를 함수 포인터로 캐스팅할 때 유형 불일치가 발생합니다.

해결책:

두 가지 접근 방식이 있습니다. 이 문제에 대해:

  1. 정적 클래스 사용 메소드:

이 메소드는 인스턴스가 아닌 클래스 자체와 연관되어 있으므로 this 매개변수가 없습니다. 예:

class C
{
public:
    static void *hello(void *)
    {
        std::cout << "Hello, world!" << std::endl;
        return 0;
    }

    static void *hello_helper(void *context)
    {
        return ((C *)context)->hello();
    }
};
...
C c;
pthread_t t;
pthread_create(&t, NULL, &C::hello_helper, &c);
  1. 일반 일반 함수 사용:

이 메서드는 클래스 정의 외부의 함수를 사용합니다. 클래스와 그 구성원은 다음과 같습니다.

// Outside the class
void c_print_wrapper(c *c_instance)
{
    c_instance->print();
}

...
c c1, c2;
pthread_t t1;
classes.push_back(c1);
classes.push_back(c2);

// Create the thread for c.print() using wrapper function
pthread_create(&t1, NULL, (void *(*)(void *))c_print_wrapper, &classes[0]);

위 내용은 벡터에서 호출되는 C 클래스 멤버 함수에 대한 스레드를 만드는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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