繁体   English   中英

std :: thread-“在没有活动异常的情况下终止”,不想“加入”它

[英]std::thread - “terminate called without an active exception”, don't want to 'join' it

按照This Question ,我正在使用线程终止用户输入上的函数。 我的代码如下所示:

bool stopper = false;
thread stopThread(userStop, &stopper);      // start thread looking for user input
for(int i = 0; i < 1000; i++) {
    if(stopper) { break; }                  // break if desired
    // Do stuff
}
return 0;

哪里,

userStop(bool *st) {
    char chChar = getchar();
    if(chChar == '\n') {
        *st = true;
    }
}

当我运行它时,我得到了terminate called without an active exception的错误terminate called without an active exception 基于以下问题:在没有活动异常的情况下调用线程终止,在没有活动异常的情况下 调用C ++终止 它看起来像是因为我不会再次“加入”线程。

问题是,我不想“加入”线程-因为那样的话,用户将需要userStop()提供输入以终止,但是我只希望用户在要提供for循环的情况下提供输入。损坏(不一定)。

谢谢!

您遇到的问题是stopThread超出堆栈范围的结果。 C ++标准对此有以下说法:

30.3.1.3线程析构函数[thread.thread.destr]

〜thread();

如果joinable(),则终止(),否则无效。 [ 注意:在析构函数中隐式分离或加入joinable()线程可能导致难以调试仅在引发异常时遇到的正确性(对于分离)或性能(对于连接)错误。 因此,程序员必须确保在线程仍可连接时,永远不要执行析构函数。 尾注 ]

这意味着在不先调用join()detach()情况下,请勿让线程超出范围。

按照您描述它的方式,您希望线程在不加入连接的情况下超出范围,因此它将在您的应用程序运行时继续运行。 这需要调用detach() 从那里,我只能提供一点智慧...

  • 现在,该线程完全负责自己的生命。 如果它不自行返回,它将永远运行(直到进程终止)。

  • 您正在获得用户输入,大概是从cingetch() 如果这些是从多个线程访问的,则不能保证它们的库实现中没有竞争条件。 轻轻踩一下。

在标准输入线程中,您将需要异步读取输入。 并唤醒停止阅读的需求和新输入。

不连接就终止线程不是合理的事情。 因此,您需要做的就是说“ yo线程,立即完成”,然后可以期望联接将迅速完成。 在某些情况下,甚至可以通过两步握手(“您的线程,完成”,然后单击“确定,我设法清理,现在加入我”)进行握手。

请注意,循环到1000看起来确实很荒谬:用户输入超时通常应基于实际时间流逝或发生其他一些使用户输入无用的事件。

终止线程不是一个好主意-您应该使线程正常退出。 如果确实终止了线程,则最终将导致getch()函数中的代码意外结束。 如果该代码在管理数据结构,分配或释放内存,或执行必须执行直到完成的其他工作,该怎么办? 您最终将某些东西置于无效状态,而当您行使该无效状态时,最终将崩溃。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM