익명 클래스 호출을 사용하여 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;
}
이 주위에있는 유일한 방법은 클래스 내의 공극 연산자() {} 을 만들어하지만 정확한 방법은 단지 스레드 참조 시동 기능의 일종을 가지고 있다는 것이다 또는 나는 다른 점을 여기에서 놓치고 있냐? 나는 생성자가 그것을 해결할 것이라고 생각 했는가?
스레드에서 수행 할 작업을 원하십니까? 일단 그 질문에 대답하면, 그 일을하는 함수 객체를 만들고, 그것을 생성시 쓰레드로 넘겨 줘라. 당신의'someclass'는 실제로 아무 것도하지 않으므로, 당신이 원하는 행동을 정말로 이해하지 못합니다. – Mankarse
C++ 11 (태그가 주어짐)에서는 람다 표현식을 인수로 사용하여 스레드를 시작할 수 있습니다. 그보다 더 익명 된 것은 없습니다. – oakad
@Mankarse'someclass'는 실제로 생성자 내의 다른 멤버 함수를 호출하여 async_accept 호출을 시도하는 서버 클래스입니다. 예제에서 많은 코드를 생략하고 싶었습니다. 하지만 생성자에서 member 함수를 호출하는 것조차도 operator()() 함수가 없으면 accept() 멤버 함수 호출을 호출 할 때 생성자 대신에 호출 할 수 있습니다. thread 내의 클래스 – Pita