문제:
다음과 같은 경우 클래스 멤버 함수에 대한 스레드를 어떻게 생성합니까? 함수는 클래스의 벡터에서 호출됩니다. 인스턴스?
예제 코드 및 오류:
다음 코드를 고려하세요.
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()는 이 숨겨진 매개변수를 처리하지 않으므로 멤버 함수를 함수 포인터로 캐스팅할 때 유형 불일치가 발생합니다.
해결책:
두 가지 접근 방식이 있습니다. 이 문제에 대해:
이 메소드는 인스턴스가 아닌 클래스 자체와 연관되어 있으므로 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);
이 메서드는 클래스 정의 외부의 함수를 사용합니다. 클래스와 그 구성원은 다음과 같습니다.
// 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!