2014-04-08 2 views
1

부스트와 함께 로컬 스레드를 사용합니다. 나는 글로벌 변수가 있습니다스레드 끝에서 thread_specific_ptr 데이터 삭제 문제가 발생했습니다.

boost::thread_specific_ptr<MyDataClass> p_timeline_ctx; 

을 내가 부스트 : 스레드 객체를 캡슐화하고 additionnal 데이터 객체가 들어있는 다음과 같은 클래스가 :

class MyThread { 
    private : 
     boost::thread t; 
     MyDataClass d; 

    public : 
     MyThread():c() {} 

     void start(void) { 
     ptr.reset(this->d); 
     this->t = boost::thread(&MyThread::worker, this); 
     } 

     void worker(void) { 
     // do something 
     } 

}; 

내가 할 때 어떤 오류가 발생하지 않습니다를 컴파일. 하지만 런타임에 작업자 함수가 종료되고 스레드가 끝나면 "glibc ... free ... invalid pointer"오류가 발생합니다.

부스트 의사에 따르면 thread_specific_ptr은 스레드가 끝날 때 가리키는 객체를 삭제하려고 시도한다는 사실에서 비롯된 것 같습니다. 그러나 문제를 해결하는 방법을 알지 못합니다.

답변

0

스레드 특정 포인터는 소유권을가집니다.

p_timeline_ctx.reset(0); 

또는 처음부터 깊은 사본을 초기화하기 : 당신은 그것을 다시 할 수

ptr.reset(new MyDataStruct(d)); 

그러나, 는 것 까지 단지로 참조를 전달 더 잘 스레드 포인터에 대한 인수

#include <boost/bind.hpp> 
#include <boost/thread.hpp> 

#include <iostream> 

struct MyDataClass { }; 

class MyThread { 
    private : 
     boost::thread t; 
     MyDataClass d; 

    public : 
     MyThread(): d() {} 

     void start(void) { 
      t = boost::thread(&MyThread::worker, this); 
     } 

     void worker() { 
      // just use this->d here 
     } 
}; 

int main() 
{ 
} 

또는 정적 스레드 함수 사용 :

#include <boost/bind.hpp> 
#include <boost/thread.hpp> 

#include <iostream> 

struct MyDataClass { }; 

class MyThread { 
    private : 
     boost::thread t; 
     MyDataClass d; 

    public : 
     MyThread(): d() {} 

     void start(void) { 
      t = boost::thread(&MyThread::worker, boost::ref(d)); 
     } 

     static void worker(MyDataClass&) { 
      // do something 
     } 
}; 

int main() 
{ 
} 
+0

을이의 스레드 고유의 사본이 필요합니다 왜 사실

는, 작업자는 이미 인스턴스 멤버 함수이므로, thread_specific_ptr을 사용하는 주된 이유는 MyThread 클래스에서 생성 된 모든 스레드가 MyDataClass 객체에 액세스해야 할뿐만 아니라 프로그램 주 스레드도 자체 스레드에 액세스해야한다는 것입니다. 액세스는 MyThread 클래스에 대한 액세스가 불가능한 정적 함수에서 발생합니다 (프로그램 주 스레드에 대해 존재하지 않기 때문에) : 그 이유는 다음과 같습니다. 'static void utilFunction() { do_something p_thread_specific_data.get()); }' – Silverspur

+0

어쨌든 내 두 샘플은 소유권 의미를 흐리게하지 않고도이를 수행 할 수있는 충분한 시작점을 제공해야한다고 생각합니다. – sehe