更新
我确实建议在范围之外创建一个std::vector
线程,所以一旦线程完成工作,我就可以.join()
,现在的问题是加入该程序并没有完全崩溃,因为它仍然在后台运行,但是出现了中止窗口。我检查了线程是否可连接,并且确实是在尝试连接时。
Timer.cpp:
void Timer::Start(int time, void(*lf)()) {
slaveTimer = std::thread(&Timer::RunTimer, this, time, lf);
}
void Timer::RunTimer(int seconds, void(*lf)()) {
auto time = (std::chrono::seconds)seconds;
std::this_thread::sleep_for(time);
lf();
slaveTimer.join(); //Program Crashes
}
Main.cpp
Timer timer1(10, [](){ std::cout << "Hello World" << std::endl; });
原始帖子
我试图用多线程制作协程,但事实是,当我尝试让线程等待X秒钟时,我会thread.detach();
,但是这会花费几毫秒的时间和屏幕(因为与GL一起显示)冻结。我可以想到的一种可能的解决方案是在执行操作之前使线程自行分离,但这似乎是不可能的,因此我想知道是否有任何方法可以执行此操作或类似的方法来解决此问题。 / p>
答案 0 :(得分:2)
您不能从作为执行线程主体的函数中调用join。它会给你错误:
错误条件: 如果this-> get_id()==,则出现resource_deadlock_would_occur std :: this_thread :: get_id()(检测到死锁)
您需要添加实例的其他方法
void Timer::stop() {
slaveTimer.join();
}
并从创建timer1
实例的线程中调用此方法
Timer timer1(10, [](){ std::cout << "Hello World" << std::endl; });
timer1.stop();
或在Timer的dtor中加入线程:
Timer::~Timer() {
slaveTimer.join();
}