线程中的成员函数指针
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 名称将包含在调用中。
我制作了一个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 名称将包含在调用中。