1

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

4

1 回答 1

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()
{
}
于 2014-04-08T14:18:05.183 回答