2012-02-14 2 views
0

클래스의 ctor에 std :: thread를 초기화해야합니다. 스레드는 클래스 자체의 멤버 함수를 실행해야합니다. ctor에서 스레드를 초기화하려고 할 때 프로그램은 구성원 함수를 실행하려고 시도합니다. (이동 의미가 구현됩니다).이동 가능한 클래스의 ctor에서 std :: thread 초기화하기

Page::Page(Motion *_parent): 
    parent(_parent) 
{ 
    std::thread x(&Page::play,this); 
    starter = std::move(x); 
} 

프로그램은 thisplay() 실행! 이 일을 표준 방법 인 경우에 나는, 지금은 std::bind을 가지고 노는거야 ...

void Page::start() 
{ 
    std::thread x(&Page::play,this); 
    x.join(); 
} 

를 그리고 잘 작동하지만 괜찮아요 아닌지 모르겠어요

편집 : 나는이 작업을 수행 코드를 바꿀거야. 이런 일에 대해 어떻게

+1

질문이 없습니다. – kukyakya

+0

@kukyakya : 문제는 ctor의 첫 번째 줄에 있으며 프로그램은'this-> play()'를 실행합니다. –

+0

@ Joachim : 나는 그것을 이해할 수 없다 ... –

답변

2

std::thread의 생성자가 자동으로 스레드 즉시을 시작하고, 새로운 스레드가 다음의 함수를 호출, 그래서

std::thread x(&Page::play,this); 

자동 this->play()를 호출 새 스레드에서.

이것은 Start() 멤버 함수를 호출하여 스레드를 명시 적으로 시작해야하는 일부 스레드 라이브러리 (예 : .Net)와 다릅니다. std::thread에는 "지연된 시작"기능이 없습니다.

다른 함수를 호출 할 때까지 스레드를 실제로 시작하지 않으려면 표시된대로 start() 함수에서 생성자의 std::thread 개체를 초기화하지 말고 대신 수행하십시오.

스레드 개체에서 join()을 호출하면 join() 호출시 코드가 스레드를 완료 할 때까지 기다립니다. 결과적으로, 예를 들어 start() 함수처럼 스레드 객체를 생성 한 직후에 조인을 넣으면 play()을 직접 호출 할 수 있습니다. start()은 스레드가 완료 될 때까지 반환되지 않습니다.

std::bindstd::thread이 필요하지 않습니다. 스레드 생성자가 자동으로 바인딩을 처리합니다.

+0

"std :: thread에는"지연된 시작 "기능이 없습니다. 실제로 yield를 사용하여 스레드가 시작될 때 제어 할 수 있습니다. – user18490

+0

수율은 스레드가 시작될 때 어떤 제어도 제공하지 않습니다. 'std :: promise','std :: future','std :: condition_variable' 또는'std :: atomic '플래그와 같은 시그널링 메카니즘을 사용할 수 있습니다. 새 스레드의 코드가 실행되지만 스레드 자체가 시작될 때 제어 할 수는 없습니다. –

+0

직접적이든 간접적이든 예를 들면 http : //www.cplusplus와 같이 입력 할 수 있습니다.com/reference/thread/this_thread/yield/ – user18490

1

:

#include <iostream> 
#include <thread> 
#include <functional> 

struct Foo 
{ 
    Foo() 
     : thread(std::bind(Foo::bar, this))   
     { } 

    ~Foo() 
     { thread.join(); } 

    static void bar(Foo *foo) 
     { } 

    std::thread thread; 
}; 

int main() 
{ 
    Foo foo; 
} 
관련 문제