2015-01-23 2 views
0

이것은 단순한 설계 오류라고 확신하지만 어쨌든 어디로 가야할 지 잘 모르겠습니다.존재하는 클래스의 C++ 11 스레드

클래스의 인스턴스에서 스레드를 생성하고 싶습니다. 특히 :

class Foo 
{ 
    public: 
     void bar() { /*do stuff*/ } 
}; 

사용

:

int main() 
{ 
    Foo foo_instance(); 

    std::thread foo_thread(foo_instance.bar); 

    foo_thread.join(); 

    return 0; 
} 

나는이의 더 자세한 버전을 컴파일 할 때, 내가 할 invalid use of non-static member function 라인 std::thread foo_thread(foo_instance.bar); 참조.

그래서 내가 여기에서 오해는 무엇입니까? 스레드로 회전하기 전에 객체를 초기화하고 "기능적"으로하고 싶습니다. 그러나 도구를 올바르게 사용하지는 않습니다.

답변

1

암시 적으로 this이기 때문에 구성원 함수가 자유 함수와 같은 방식으로 호출하지 않으며 std::thread에는 Callable이 필요합니다. 이는 자유 함수보다 약간 융통성이 있습니다. 당신이 경우에

가장 간단한 람다 사용하는 것입니다

std::thread foo_thread([&] { foo_instance.bar(); }); 
+0

을 또는 당신은 단순히 스레드의 ctor'표준 : : 스레드 foo_thread (푸 :: 바, foo_instance)에 인수로 인스턴스를 제공 할 수 있습니다; '. – Snps

+0

하지만 작동하지만 인수는'std :: thread' ctor에 의해 복사되고이'std :: thread foo_thread (& Foo :: bar, std :: ref (foo_instance))와 같이'std :: ref'를 사용해야합니다; '스레드가 일시적으로 복사 된'foo_instance'와 함께 작동합니다 – galop1n

+0

예, 복사 동작이 이유로 만들어졌습니다. * 대부분 * 원하는 * 것입니다. 로컬 복사본을 사용하면 간접 및 동기화 문제 등을 해결할 수 있습니다.하지만 스레드가 호출 스레드의 인스턴스를 업데이트하도록하려면 참조가 필요합니다. 그리고 동기화. – Snps

관련 문제