我正在尝试创建一个std::thread的包装类。该类提供了一个kick方法,以启动线程并调用一个纯虚函数。我使用一个派生类来调用这个kick方法,派生类也已经实现了这个虚函数。
class Executor
{
public:
// constructor
Executor();
// destructor
~Executor();
// kick thread execution
void Kick();
private:
// thread execution function
virtual void StartExecution() = 0;
// thread handle
std::thread mThreadHandle;
};
以下是执行器类的实现
Executor::Executor()
{
// Nothing to be done here
}
Executor::~Executor()
{
if (mThreadHandle.joinable())
mThreadHandle.join();
}
void Executor::Kick()
{
// mThreadHandle = std::thread(&Executor::StartExecution, this);
mThreadHandle = std::thread([this] {this->StartExecution();});
}
我正在使用一个继承了该类并实现了 StartExecution 方法的 Consumer 类。当我使用 kick 方法时,会显示纯虚函数调用,并且程序终止。
std::unique_ptr<Consumer> consumer = std::make_unique<Consumer>();
consumer->Kick();
在执行器的Kick方法中,我添加了一个断点并开始查找问题。它会两次到达以下代码行:
第一次是由于Kick方法,第二次是为了执行lambda函数。第一次我发现this指向Consumer类。但是当它到达lambda函数时,它变得混乱了,vptr指向了纯虚函数。mThreadHandle = std::thread([this] {this->StartExecution();});
我对此很感兴趣,希望能够找到问题所在,而不仅仅是简单的答案。
Consumer
类中有一个错误。由于你没有展示代码,所以无法提供更多信息。 - Pete Becker