gpt4 book ai didi

c++ - 尝试加入时线程崩溃

转载 作者:搜寻专家 更新时间:2023-10-31 02:04:11 29 4
gpt4 key购买 nike

更新

我按照建议在范围外创建线程的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 显示)卡住了。我能想到的一种可能的解决方案是让线程在执行操作之前分离自身,但这似乎不可能,所以我想知道是否有任何方法可以做到这一点或类似的方法来解决这个问题。

最佳答案

您不能从作为执行线程主体的函数中调用 join。它会给你错误:

Reference

Error Conditions : resource_deadlock_would_occur if this->get_id() == std::this_thread::get_id() (deadlock detected)

例如你需要添加额外的方法

void Timer::stop() {
slaveTimer.join();
}

并从创建 timer1 实例的线程调用此方法

Timer timer1(10, [](){ std::cout << "Hello World" << std::endl; });
timer1.stop();

或者在 Timer 的 dtor 中加入线程:

Timer::~Timer() {
slaveTimer.join();
}

关于c++ - 尝试加入时线程崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54067235/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com