下面的代码在运行时会炸毁,但在调试时可以正常工作。我不明白为什么。我根据需要在析构函数中加入线程。
有人可以帮忙吗?
令人惊讶的是,代码在调试过程中运行良好。
尝试几次调试,每次都很好。
#include<iostream>
#include<string>
#include<thread>
#include<memory>
using namespace std;
template<typename T> class Runnable
{
private:
std::thread t;
void runImpl()
{
static_cast<T*>(this)->run();
}
public:
virtual void run() = 0;
void start()
{
this->t = std::thread(&Runnable::runImpl, this);
}
~Runnable()
{
std::cout << "I am in the destructor of the base class" << std::endl;
if(t.joinable())
{
std::cout << "joinable" << std::endl;
t.join();
}
else
std::cout << "not joinable" << std::endl;
}
};
class HelloWorld : public Runnable<HelloWorld>
{
public:
void run()
{
std::cout << "I am in thread id = " << std::this_thread::get_id() << " and the message is : HelloWorld How are you" << std::endl;
}
};
int main(int argc, char* argv[])
{
std::cout << "I am in the main thread id = " << std::this_thread::get_id() << std::endl;
{
HelloWorld item;
item.start();
}
return(0);
}
答案 0 :(得分:4)
在*this
上,在调用虚拟成员函数的工作线程与进入析构函数的主线程之间存在竞争。这表现出不确定的行为。
实际上,vtable指针可能已经更新为Runnable
的指针,并且线程最终调用了纯虚函数。