2017-11-29 1 views
1

최근에 C++ 11 스레드를 사용하고 있으며 뭔가 이상한 일이 생겼습니다. 클래스 내부에서 스레드를 시작할 수있는 메서드를 만들었습니다. 시작 스레드 메소드와 스레드의 콜백 함수는 클래스 메소드입니다.C++의 스레드 11 클래스 구성원이 아닙니다.

void Person::callbackForThread(){ 
    ... 
} 


void Person::startThread(){ 
    this call threads. Something like: 
    thread(callbackForThread); 
} 

문제는 저 클래스 메소드이 두 함수를 선언하는 것을 허용하지 않는 C++ 11 : 내 Person.cpp 파일에 내가 가진 명확합니다. 즉, 정상적인 기능으로 선언하면 다음과 같습니다. 즉,

void callbackForThread(){ 
    ... 
} 


void startThread(){ 
    this call threads. Something like: 
    thread(callbackForThread); 
} 

모든 기능이 작동합니다. 가능한 경우 C++에서 클래스 내부에서 스레드 및 콜백을 선언 할 수있는 방법을 알고 있습니다. 더 멀리는 라이브러리와 실제 클래스 이름의 포함을 생략했습니다. 이 질문에 표시된 클래스는 실제 데이터가 아닙니다.

+0

생각하지 못했습니다 .... – BossShell

답변

2

Person::callbackForThread은 숨겨진 첫 번째 인수 인 this을 사용하기 때문입니다.

thread([this]() { this->callbackForThread(); }); 

또는

krzaq 피드백에서
using namespace std::placeholders; 
thread(std::bind(&Person::callbackForThread, this, _1)); 

: threadstd::thread 인 경우, 그것은 detach 에드 또는 어떻게 든 저장해야합니다 유용하게 람다와 std::bind 어디

입니다 .

+5

또는 그냥'thread (& Person :: callbackForThread, this)', 바인딩 필요 없음 – PeterT

+0

예, 훌륭합니다. 너는 내 하루를 만들어! 감사합니다. – BossShell

+1

왜'thread (& Person :: callbackForThread, this)'가 아닌가? 부수적으로 이것은 표현식이며 스레드 객체의 끝에서 스레드 객체를 파괴합니다. 그 시간이 끝나지 않았다면 (매우있을 법하지 않음)'std :: terminate'를 호출 할 것입니다. – krzaq