提升线程不调用线程函数

时间:2015-08-20 19:26:40

标签: c++ linux multithreading boost boost-thread

我正在尝试创建一个boost线程,我看到线程已创建,但控件没有进入线程函数。有人可以解释一下为什么会这样吗?

请参阅下面的代码。

header_file.h

class fa {
public:
  fa();
  ~fa();
  int init(void);
  static void* clThreadMemFunc(void *arg) { return ((fa*)arg)->collectData((fa*)arg); }
  void* collectData(fa *f );
private:
  int m_data;
  boost::thread *m_CollectDataThread;
};

`

TEST.CPP

int fa::init(void)
{
     if (m_CollectDataThread== NULL)
     {
          printf("New Thread...\n");
          try 
          {
              m_CollectDataThread = 
              new boost::thread((boost::bind(&fanotify::clThreadMemFunc, this)));
          }
          catch (...){perror("Thread error ");}
          printf("m_CollectDataThread: %p \n", m_CollectDataThread);
     }
 return 0;
}
void* fa::collectData(fa *f)
{
    printf("In collectData\n");
    int data = f->m_data;
    printf("data %d",data);
}

test.cpp被编译/构建为库(test.so),另一个主函数调用init函数。我看到变量m_collectDataThread的值从null变为某个值(线程被创建),catch也没有得到任何异常。

但我没有看到collectData中的任何陈述被打印出来。为什么线程无法访问它?

2 个答案:

答案 0 :(得分:1)

也许尝试添加联接。

E.g。

 try 
      {
          m_CollectDataThread = 
          new boost::thread(boost::bind(&fanotify::clThreadMemFunc, this));
           m_CollectDataThread->join();    
      }

答案 1 :(得分:0)

当你使用boost::threadstd::thread时,你不需要传递线程函数的旧方法(使用静态方法和转换void *指针),你可以直接调用类方法:

class fa {
public:
  fa();
  ~fa();
  int init(void);
  void collectData();
private:
  int m_data;
  boost::thread *m_CollectDataThread;
};

m_CollectDataThread = new boost::thread( &fa::collectData, this );
// or explicitly using bind
m_CollectDataThread = new boost::thread( boost::bind( &fa::collectData, this ) );

boost是C ++库,而不是C