我使用带有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
}
};
我在编译时没有任何错误。但是在运行时,当工作函数退出并且线程结束时,我会得到一个"glibc…free…invalid pointer"错误。
我想这是因为,根据boost文档,thread_specific_ptr试图在线程结束时删除它所指向的对象。但是我不知道该怎么解决这个问题。
特定于线程的指针拥有所有权。你可以重置它:
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()
{
}