위에 제공된 모든 힌트는 순차 프로그램에 맞습니다. 즉, 스레드가없는 프로그램입니다. 스레드를 사용하면 상황이 바뀝니다. 우선, 기본적으로 std :: thread에 대한 매개 변수는 함수 및 함수 매개 변수입니다. 아마 당신은이 책 "행동 C++ 동시성을"공부하였으며, 저자는 흥미로운 예를 보여줍니다
void do_some_work();
thread my_thread(do_some_work); //thread receives the function address
이 기능 가정 :
무효 do_other_job (INT의 k)를; 코드 본문에서는 수행해야합니다
k=3;
thread my_thread2(do_other_job, k);
다른 스레드를 생성하기 위해.
그래서 스레드를 사용하면 컴파일러는 기본적으로 클래스 대신 f로 f (std :: thread my_thread (f);)를 해석합니다. 이를 변경하려면 컴파일러에 경고하기 위해 연산자()를 시작해야합니다. 그러면 클래스와 작업하고 있습니다.
class background_task{
public:
background_task(){
do_sth();
do_sth_else();
}
void operator()(){}
};
background_task f;
thread mythread10(f);
결국, 그것은 연산자를 공급, 스레드를 사용하여, 정확하지, 그래서이 코드는 작동하지 않습니다 : 또 다른 코드가 될 수
이
void operator()(int x){
do_sth();
cout<<"x = "<<x<<endl;
}
그것 때문에 모든 코드 내에서 발생 대괄호는 읽기 전용이며 런타임 중에는 변경할 수 없습니다. 생성자에 변수를 삽입하려면 스레드 초기화에 넣어야합니다. 따라서 :
class backg{
public:
backg(int i){
do_sth(i);
}
void operator()(){}
};
int main(){
thread mythread{ backg(12) }; //using c++11
return 0;
}
실수없이 실행되며 생성 된 스레드에서 do_sth (12) 함수를 수행합니다.
도움이 되었기를 바랍니다.
시원하고 더 분명합니다. –
이 명시 적 호출 태스크()를 제외하고 operator()()에 대한 암시 적 호출이 있습니까? –
@ forester2012, 아니 훨씬 더 어색한'task.operator()()'구문을 사용할 수 있지만 항상 명시 적으로 호출해야합니다. 이 연산자를 내부적으로 호출하는 많은 표준 알고리즘이 있습니다. –