尝试加入时线程崩溃

Posted

技术标签:

【中文标题】尝试加入时线程崩溃【英文标题】:Thread crashing when trying to join 【发布时间】:2019-01-07 00:30:54 【问题描述】:

更新

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

【问题讨论】:

任何能看到几毫秒的人都有一些邪恶的眼球处理能力。 为什么要暂停线程才能调用detach() @Galik 我需要分离它然后暂停它,所以 sleep_for 不会影响其他线程 我个人会避免分离线程。我通常把它们放在一个std::vector&lt;std::thread&gt; 的范围内,这个范围旨在延长它们的寿命。 我强烈敦促您做出决定,线程将被分离(并管理其自己的生命周期)或加入(并且加入它的事物将管理其生命周期)并坚持该决定.试图区分差异会导致不必要的复杂化。 【参考方案1】:

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

Reference

错误情况: resource_deadlock_would_occur if this->get_id() == 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();

【讨论】:

以上是关于尝试加入时线程崩溃的主要内容,如果未能解决你的问题,请参考以下文章

删除线程时崩溃

尝试设置框架时 UIImageView 崩溃

当我尝试停止动画 UIActivityIndi​​catorView 时内存崩溃

在模拟器上运行应用程序时,它崩溃并说线程 1:断点 3.1。我该怎么办?

Spritekit 游戏崩溃(因为 SKLightNode 线程问题?)

尝试启动 Boost 线程时出错