2012-05-22 4 views
1

어떤 개체가 스레드 콜백 함수의 인수로 전달되어야하는 상황이 있습니다. 객체는 동적으로 생성되고 스레드로 전달 된 후 객체는 더 이상 필요 없으며 (스레드를 시작하는 메소드에서) 더 이상 사용되지 않습니다. Thread 함수는 이제 객체를 소유해야하는 유일한 컨텍스트입니다.부스트 스마트 포인터를 스레드 함수에 전달

내가 부스트 스마트 포인터를 쓰겠다고 가정하면 (여기에 원시 포인터를 쓰레드로 전달하는 대신), 어느 쪽이 가장 적합할까요? 이 경우 가장 좋은 방법은 무엇입니까?

실제로 필요한 것은 복사 생성자를 통해 이동 의미가있는 std::auto_ptr입니다. 나는이 똑똑한 포인터가 여기에 완벽하게 들어 맞을 것이지만 잘 알려진 이유 때문에 더 이상 사용되지 않을 것이라고 믿는다 (그리고 나는 tr1C++11 포인터에 의존 할 수 없다). 을 사용해야 만한다.이 코드는 반드시 Visual Studio 2008 및) 모두를 컴파일하십시오.

boost::shared_ptr 옵션이 있습니다. 값으로 전달할 수 있지만 과도하다고 생각합니다. 으로 이동 의미를 에뮬레이트 할 수 있습니까? 두 문맥 사이에서 객체를 공유하지 않는다고 여기서는 참조 계산이 필요하지 않습니다. 객체에 대한 소유권을 다른 문맥으로 옮기고 싶습니다.

답변

2

boost::interprocess::unique_ptr을 사용하거나 Boost.Move을 사용하여 직접 unique_ptr을 작성할 수 있습니다.

boost::interprocess::unique_ptr은 구현시 Boost.Move를 사용하고 Boost.Move는 C++ 11 이동 시맨틱 C++ 03을 에뮬레이트합니다.

+0

이제'boost :: interprocess :: unique_ptr'을 살펴 보겠습니다. 도와 주셔서 감사합니다. –

0

shared_ptr은 (당신을 포함하여) 대부분의 상황에서 잘 작동합니다. 다음 패턴을 사용할 수 있습니다.

shared_ptr<MyT> param = .....; 
thread = boost::thread(thread_routine, param); 
param.reset(); 

... 이제 thread_routine 만 개체를 ​​보유합니다.

+0

그래,이 솔루션을 알고 있고 제 경우에도'reset '을 호출 할 필요가 없습니다. 즉,'param'이 바로 범위를 벗어나면 (함수가 쓰레드가 생성되는 즉시 반환됩니다). 하지만 Boost가 이동 의미를 지원하는 참조 포인터가 아닌 스마트 포인터를 가지고 있는지 궁금합니다. 'boost :: interprocess :: unique_ptr'이 내가 원하는 것 같습니다. –

관련 문제