2014-04-17 7 views
0

익명 클래스 호출을 사용하여 std :: thread를 올바르게 시작하는 방법에 대해 궁금합니다.익명 클래스 호출로 std :: thread를 시작하는 방법

아래 코드를 사용하면 내 클래스가 1 개의 멤버 변수 만 갖고 std :: thread td (someclass (shared_mutex))를 호출하면; '표준 : : 스레드 TD (someclass)': I 경고 C4930의 컴파일러 경고를 프로토 타입 함수가 호출되지

그러나, 나는 다음과 전화로 두 번째 멤버 변수를 추가하는 경우 (변수 정의가 의도인가?) 그것과 함께 std :: thread td (someclass (shared_mutex, x)); C2064 오류로 인해 오류가 발생합니다. 용어는 인수가 0 인 함수로 평가되지 않습니다.

class someclass 
{ 
private: 
    std::mutex& shared_mutex; 
    int x; 

public: 
    someclass(std::mutex& init_mutex, int init_x) : 
    shared_mutex(init_mutex), 
    x(init_x) 
    {} 
    //... 
}; 

int main() 
{ 
    std::mutex shared_mutex; 
    int x = 10; 
    std::thread td(someclass(shared_mutex,x)); 
    td.join(); 
    return 0; 
} 

이 주위에있는 유일한 방법은 클래스 내의 공극 연산자() {} 을 만들어하지만 정확한 방법은 단지 스레드 참조 시동 기능의 일종을 가지고 있다는 것이다 또는 나는 다른 점을 여기에서 놓치고 있냐? 나는 생성자가 그것을 해결할 것이라고 생각 했는가?

+0

스레드에서 수행 할 작업을 원하십니까? 일단 그 질문에 대답하면, 그 일을하는 함수 객체를 만들고, 그것을 생성시 쓰레드로 넘겨 줘라. 당신의'someclass'는 실제로 아무 것도하지 않으므로, 당신이 원하는 행동을 정말로 이해하지 못합니다. – Mankarse

+1

C++ 11 (태그가 주어짐)에서는 람다 표현식을 인수로 사용하여 스레드를 시작할 수 있습니다. 그보다 더 익명 된 것은 없습니다. – oakad

+0

@Mankarse'someclass'는 실제로 생성자 내의 다른 멤버 함수를 호출하여 async_accept 호출을 시도하는 서버 클래스입니다. 예제에서 많은 코드를 생략하고 싶었습니다. 하지만 생성자에서 member 함수를 호출하는 것조차도 operator()() 함수가 없으면 accept() 멤버 함수 호출을 호출 할 때 생성자 대신에 호출 할 수 있습니다. thread 내의 클래스 – Pita

답변

1

veximg 구문 분석을 피하기 위해 개체를 구성하려면 { 및구문을 사용하십시오.

std::thread td(someclass(shared_mutex,x)) 

당신이 당신의 스레드가 someclass의 장기 실행 생성자를 실행하고 곧바로 새로 건설 된 someclass를 폐기 것 같다

std::thread td{someclass{shared_mutex,x}} 
0

된다.

int main() 
{ 
    std::mutex shared_mutex; 
    int x = 10; 
    std::thread td([&]{someclass(shared_mutex,x);}); 
    td.join(); 
    return 0; 
} 

주의 할 : 당신이 능력이 있으면 부담없이 산란 새 스레드를 피해야한다, 그래서 새 스레드가 상당히 비용이 많이 드는 작업입니다 건설 이것은 단지가 수행하는 함수 객체 스레드 생성자를 통과하여 수행 할 수 있습니다 새 스레드를 매우 드물게 만들지 않는 한 기존 스레드를 다시 사용합니다.