线程中的成员函数指针

时间:2018-07-08 09:56:51

标签: c++ multithreading function-pointers

我制作了一个使用成员函数数组初始化线程数组的类。

我不知道如何将函数指针传递给线程构造函数。关于该主题的文档很少。

class.h

#define N_FUNCTIONS 23
class TradingData
{
public:
  void EXECUTE();

  void Book();
  void Charts();
  void Company();
  void Dividends();
  void Earnings();
  void EffectiveSpread();
  void Financials();
  void KeyStats();
  void LargestTrades();
  void List();
  void Logo();
  void News();
  void OHLC();
  void Peers();
  void Previous();
  void Price();
  void Quote();
  void Relevant();
  void Splits();
  void TimeSeries();
  void VolumeByVenue();
  void S_Previous();
  void S_Symbols();

private:

  std::thread p_thread[N_FUNCTIONS];

  typedef void (TradingData::*overall)();
  overall p_overall[N_FUNCTIONS] = {
    &TradingData::Book,
    &TradingData::Charts,
    &TradingData::Company,
    &TradingData::Dividends,
    &TradingData::Earnings,
    &TradingData::EffectiveSpread,
    &TradingData::Financials,
    &TradingData::KeyStats,
    &TradingData::LargestTrades,
    &TradingData::List,
    &TradingData::Logo,
    &TradingData::News,
    &TradingData::OHLC,
    &TradingData::Peers,
    &TradingData::Previous,
    &TradingData::Price,
    &TradingData::Quote,
    &TradingData::Relevant,
    &TradingData::Splits,
    &TradingData::TimeSeries,
    &TradingData::VolumeByVenue,
    &TradingData::S_Symbols,
    &TradingData::S_Previous
};

class.cpp

void TradingData::EXECUTE()
{
    for (int i = 0; i < N_FUNCTIONS; i++) {
        p_thread[i] = std::thread((this->*p_overall[i])()); //here is the problem
    }
    for (int i = 0; i < N_FUNCTIONS; i++) {
        p_thread[i].join();
    }
    std::cout << "finished successfully" <<std::endl;
}

下一个错误: 错误C2440'':无法从'void'转换为'std :: thread'

2 个答案:

答案 0 :(得分:1)

您应该写电话;

p_thread[i] = std::thread(TradingData::p_overall[i], this);

如果调用成员函数,则类名将包含在调用中。

答案 1 :(得分:0)

p_thread[i] = std::thread((this->*p_overall[i])());

这会将正在调用的成员函数的返回值传递给线程构造函数。但是,由于您没有返回可调用的内容,因此,这当然甚至无法编译。

请注意,您实际上在其上调用成员函数的对象(对您来说是透明的)作为第一个参数传递给被调用的函数。这是创建线程时需要反映的内容:

p_thread[i] = std::thread(p_overall[i], *this);

启动时,线程现在将以*this作为第一个参数调用成员函数。请注意,尽管函数内部的this被定义为指针,但实际上成员函数会接受引用,从而取消引用此指针...

有时候,lambda很有用,在这里看起来像这样:

std :: thread t(this,i {(this-> * p_overall [i])();});

当然可以,在给定的情况下过度杀伤,但将来可能会在其他情况下使用...