我使用带有boost的线程本地存储。 我有一个全局变量:
boost::thread_specific_ptr<MyDataClass> p_timeline_ctx;
我有以下类,它封装了一个boost :: thread对象并包含一个额外的数据对象:
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
}
};
编译时我没有收到任何错误。但是在运行时,当worker函数退出并且线程结束时,我得到一个“glibc ... free ... invalid pointer”错误。
我想这是因为根据boost文档,thread_specific_ptr尝试删除线程结束时指向的对象。但我不知道如何解决这个问题。
答案 0 :(得分:0)
线程特定指针取得所有权。你可以重置它:
p_timeline_ctx.reset(0);
首先使用深层副本进行初始化:
ptr.reset(new MyDataStruct(d));
然而,你远更好只是将引用作为参数传递给线程指针。
实际上,worker已经是一个实例成员函数,所以,为什么你需要一个特定于线程的副本:
#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()
{
}