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은 스레드가 끝날 때 가리키는 객체를 삭제하려고 시도한다는 사실에서 비롯된 것 같습니다. 그러나 문제를 해결하는 방법을 알지 못합니다.
을이의 스레드 고유의 사본이 필요합니다 왜 사실
는, 작업자는 이미 인스턴스 멤버 함수이므로, thread_specific_ptr을 사용하는 주된 이유는 MyThread 클래스에서 생성 된 모든 스레드가 MyDataClass 객체에 액세스해야 할뿐만 아니라 프로그램 주 스레드도 자체 스레드에 액세스해야한다는 것입니다. 액세스는 MyThread 클래스에 대한 액세스가 불가능한 정적 함수에서 발생합니다 (프로그램 주 스레드에 대해 존재하지 않기 때문에) : 그 이유는 다음과 같습니다. 'static void utilFunction() { do_something p_thread_specific_data.get()); }' – Silverspur
어쨌든 내 두 샘플은 소유권 의미를 흐리게하지 않고도이를 수행 할 수있는 충분한 시작점을 제공해야한다고 생각합니다. – sehe