2015-01-06 2 views
0

다음 두 함수가 있습니다. 첫 번째 함수는 충돌하지만 두 번째 함수는 정상적으로 실행됩니다. 처음에는 run()이 반환 될 때 객체가 파괴되지만 스레드는 여전히 work() 함수를 실행 중이므로 정의되지 않은 동작이 발생할 수 있음을 이해합니다.부스트 스레드에서 클래스의 멤버 함수를 호출하십시오.

하지만 두 번째 이유는 무엇입니까? 우리가 shared_ptr에 객체를 래핑하면 쓰레드보다 오래 남아있을 것인가?

저를 계몽하십시오. 감사.

void run() { 
    Object object(); 
    boost::thread t(&Object::work, &object); 
} 

void run() { 
    std::shared_ptr<Object> object_(new Object()); 
    boost::thread t(&Object::work, object); 
} 

답변

1

예. 변수를 값으로 바인딩합니다.

이것은 바인드 표현식이 사라질 때까지 공유 포인터의 복사본이 있음을 의미합니다. 이것은 객체를 계속 유지합니다.

흥미로운 점 : boost::bind은 구성원 함수의 this 매개 변수에 대해 shared_ptr<T>에 대한 바인딩을 지원합니다. std::bind에는이 기능이 없습니다 (아직?)

+0

여기서 바인드 표현식은 무엇입니까? t (& Object :: work, & object)는 암묵적으로 bind를 호출하고 있는가? – jiawen

+0

@ jiawen 예. 미안, 그건 분명했을거야. 실제로, boost :: bind를 사용할 필요는 없지만,'std :: thread' 구조체'std :: bind'는 같은 방법으로 지정됩니다. 이것은 또한 참조를 묶고 싶다면'boost :: ref (object)'(또는'std :: ref (object)')가 필요하다는 것을 의미한다. – sehe

관련 문제