线程端的thread_specific_ptr数据删除问题



我使用带有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()
{
}

最新更新