如何将类方法的指针传递给boost线程

时间:2014-05-28 10:10:06

标签: c++ multithreading pointers boost

我最近开始尝试使用boost :: thread,我想实现一个数据记录器,它在一个单独的线程中定期打印一些类方法的返回值(1 / sec)。

Data类有两个私有变量dataRx和dataTx以及两个公开这些值的getter。

Data.h:

class Data
{
public:
  Data();
  virtual unsigned long GetDataTx();
  virtual unsigned long GetDataRx();

private:
  unsigned long fDataTx;
  unsigned long fDataRx;
};

Data.cpp:

#include "Data.h"

Data::Data() : fDataTx(5), fDataRx(10)
{
}

unsigned long Data::GetDataTx()
{
  return fDataTx;
}

unsigned long Data::GetDataRx()
{
  return fDataRx;
}

主要功能:

#include <iostream>
#include <unistd.h>
#include <boost/thread.hpp>
#include <boost/bind.hpp>
#include "Data.h"

using namespace std;

void Log(void *objPtr1, void *objPtr2)
{
  while(1) {
    cout << objPtr1->GetDataTx() << " " << objPtr2->GetDataTx() <<  endl;
    sleep(1);
  }
}

int main(int argc, char** argv)
{
  Data obj1;
  Data obj2;

  boost::thread logThread(Log, &obj1, &obj2);
}

但是我收到了这个错误:

main.cpp: In function ‘void Log(void*, void*)’:
main.cpp:14:20: error: ‘void*’ is not a pointer-to-object type
     cout << objPtr1->GetDataTx() << " " << objPtr2->GetDataTx() <<  endl;
                    ^
main.cpp:14:51: error: ‘void*’ is not a pointer-to-object type
     cout << objPtr1->GetDataTx() << " " << objPtr2->GetDataTx() <<  endl;
                                                   ^

显然,这不是将指针传递给线程的正确方法。有什么建议吗?

1 个答案:

答案 0 :(得分:1)

将指针传递给线程是正确的方法。一个问题:为什么你的日志函数会收到void个指针,而不是Data个指针?如果你应该使用void指针,你应该在函数中将它们转换为Data*

void Log(void *objPtr1, void *objPtr2)
{
  Data* ptr1 = static_cast<Data*>(objPtr1), ptr2 = static_cast<Data*>(objPtr2);
  while(1) {
    cout << objPtr1->GetDataTx() << " " << objPtr2->GetDataTx() <<  endl;
    sleep(1);
  }
}