线程中的成员函数指针

Member-Function Pointer in Threads

我制作了一个class,它使用一组成员函数来初始化一组线程。

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

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'

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

这会将被调用的成员函数的return值传递给线程构造函数。但是因为你没有 return 一些可调用的东西,所以这当然会编译失败。

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

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

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

有时,lambda 可能很有用,如下所示:

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

当然,在给定的情况下有点矫枉过正,但在未来的某个时候可能对其他情况有用...

你应该写电话;

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

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