2011-02-24 3 views
5

boost :: shared_ptr을 Windows 스레드 함수의 포인터로 어떻게 전달할 수 있습니까? 다음 코드 가정 :boost :: shared_ptr을 Windows 스레드 함수에 대한 포인터로 어떻게 전달할 수 있습니까?

test::start() 
{ 
    .... 
    _beginthreadex(NULL, 0, &test::threadRun, &shared_from_this(), 0, &threadID); 

    ... 
    ... 
} 

/*this is a static function*/ 
UINT __stdcall test::threadRun(LPVOID lpParam) 
{ 
    shared_ptr<test> k = *static_cast< shared_ptr<test>* >(lpParam); 
    ... 
} 

을 나는 당신의 생각은 무엇인가,이 코드는 잘못된 생각? 어떻게해야합니까?

편집 : 나는 boost :: weak_ptr로 내 문제를 해결했다. 이 내 자신의 대답을 확인 page

+2

대신 Boost.Thread를 사용하지 않으시겠습니까? – jalf

+0

나는 윈도우 쓰레드와 함께 작동하는 많은 코드를 가지고있다. 현재는 그들을 부스트로 변환 할 충분한 시간이 없다. 쓰레드, 또한 나는 boost.thread를 사용한 적이 없다. –

+3

모두 변환 할 필요가 없습니다. 그러나 Boost.Thread는 유형 안전성이있어서이 문제를 매우 직관적으로 처리합니다. – jalf

답변

1

test::start() 
{ 
    // [...] 
    _beginthreadex(NULL, 0, &test::threadRun, this, 0, &threadID); 
    // [...] 
} 

// this is a static function 
UINT __stdcall test::threadRun(LPVOID lpParam) 
{ 
    test* self = static_cast<test*>(lpParam); 

    // do whatever you want with all the instance members :) 

    self->getMyShared(); 
    self->useMyGreatMemberMethof(); 

    // ... 
} 

my2c : 실질적으로, 콜백 클래스의 구성원으로이다 참조 카운팅이 잘 작동합니다. 당신이 boost::shared_ptr을 통과하려면

당신은 침입 참조 카운트가있는 구조체에 넣고에 전달합니다.

을이 당신을 가정 한 것입니다 단지 원시 포인터를 전달하지 않고 얻을 수있는 완료되면 삭제 스레드를 수신합니다.

+3

wPtr은 test :: start()의 지역 변수이므로 test :: start()가 끝날 때 무효화되므로 문제가 해결되지 않을 수 있습니다. 따라서 문제는 이전과 동일합니다. start()가 종료되기 전에 매개 변수를 "선택"하십시오. – CashCow

1

당신은 reinterpret_cast 사용해야하며 적어도 하나의 shared_ptr 산란하는 동안주의를 기울이십시오. 그렇지 않으면 개체가 파괴됩니다. 즉, shared_ptr에 대한 포인터를 전달하기 때문에 일반적인 포인터 보호 기능을 사용할 수 없으며 기존 shared_ptrs가 모두 삭제 된 경우 스레드가 생성 될 때 잘못된 포인터가 포함됩니다.

3

클래스에서 정적 함수/메소드로 매개 변수를 전달해야하고 콜백 매개 변수 (스레드 콜백에서 일반적) 인 경우 일반적으로 this을 콜백에 전달합니다. 이렇게하면 간단한 캐스팅을 할 수 있으며 수업의 모든 멤버에게 액세스 할 수 있습니다.

test::start() 
{ 
    .... 
    shared_ptr<test> shPtr = shared_from_this(); 
    boost::weak_ptr<test> wPtr=shPtr; 
    _beginthreadex(NULL, 0, &test::threadRun, &wPtr, 0, &threadID); 

    ... 
    ... 
} 

/*this is a static function*/ 
UINT __stdcall test::threadRun(LPVOID lpParam) 
{ 
shared_ptr<test> k  = static_cast< boost::weak_ptr<test>* >(lpParam)->lock(); 
    ... 
} 
0

이 실제로 어디에서 침입 상황 중 하나입니다 : 내가 부스트 :: weak_ptr를하여 내 문제를 해결

관련 문제