线程结束时thread_specific_ptr数据删除的问题

时间:2014-04-08 14:09:13

标签: multithreading boost thread-local-storage

我使用带有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尝试删除线程结束时指向的对象。但我不知道如何解决这个问题。

1 个答案:

答案 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()
{
}