#include <thread>
#include <iostream>
class bar {
public:
void foo() {
std::cout << "hello from member function" << std::endl;
}
};
int main()
{
std::thread t(&bar::foo, bar());
t.join();
}
편집 : 편집을 회계 처리하려면 다음과 같이해야합니다.
std::thread spawn() {
return std::thread(&blub::test, this);
}
업데이트 : 더 많은 요점을 설명하고 싶습니다. 일부 의견도 설명했습니다.
위에서 설명한 구문은 INVOKE 정의 (§20.8.2.1)에 따라 정의됩니다.
INVOKE (f, t1, t2, ..., tN)를 다음과 같이 정의하십시오.
- (t1. * f) (t2, ..., tN) f가 클래스 T의 멤버 함수에 대한 포인터이고 t1이 T 유형의 오브젝트이거나 T 유형의 오브젝트에 대한 참조이거나 T로부터 유도 된 유형의 객체;
- f가 클래스 T의 멤버 함수에 대한 포인터이고 t1이 이전 항목에서 설명한 유형 중 하나가 아닌 경우 ((* t1). * f) (t2, ..., tN);
- n == 1이고 f가 클래스 T의 멤버 데이터에 대한 포인터이고 t 1이 T 유형
의 오브젝트 또는 T 유형의 오브젝트에 대한 참조 또는 다음
에서 파생 된 유형 의 오브젝트에 대한 참조 인 경우 t1. * f 티;
- (* t1). * f N == 1 일 때 f는 클래스 T의 멤버 데이터에 대한 포인터이고 t 1은 이전 항목에서 설명한 유형 중 하나가 아닙니다.
- 다른 모든 경우에는 f (t1, t2, ..., tN).
내가 지적하고자하는 또 다른 일반적인 사실은 기본적으로 스레드 생성자가 전달 된 모든 인수를 복사한다는 것입니다. 그 이유는 인수가 호출 스레드보다 오래 지속되어야하기 때문에 인수를 복사하면 보장됩니다. 대신 실제로 참조를 전달하려면에서 std::reference_wrapper
만든을 사용할 수 있습니다 std::ref
.
std::thread (foo, std::ref(arg1));
이렇게하면 스레드가 작동 할 때 인수가 계속 존재하도록 보장 할 것입니다.
위에서 언급 한 모든 내용은 std::async
및에 적용 할 수 있습니다 std::bind
.