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

Dil*_*rix 23 c++ multithreading

根据这个问题,我正在使用一个线程来终止用户输入的功能.我的代码看起来像:

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;
Run Code Online (Sandbox Code Playgroud)

哪里,

userStop(bool *st) {
    char chChar = getchar();
    if(chChar == '\n') {
        *st = true;
    }
}
Run Code Online (Sandbox Code Playgroud)

当我运行它时,我得到错误terminate called without an active exception.基于这些问题:线程终止叫不活跃异常,C++终止叫不活动异常 ; 它看起来像它,因为我不是'再次'加入线程.

问题是,我不想'加入'线程 - 因为那时用户需要提供输入userStop()才能终止,但我只希望用户在断开for循环时提供输入(它不一定).

谢谢!

Sea*_*ine 36

您遇到的麻烦是stopThread堆栈超出范围的结果.C++标准有以下几点说:

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

〜螺纹();

如果joinable()然后terminate(),否则没有效果.[ 注意:在析构函数中隐式分离或连接joinable()线程可能导致难以调试正确性(用于分离)或性能(用于连接)仅在引发异常时遇到错误.因此,程序员必须确保在线程仍可连接时永远不会执行析构函数.- 结束说明 ]

这意味着你不应该先调用其中任何一个join()或者让线程超出范围detach().

您描述它的方式,您希望线程超出范围而不加入,因此它将在您的应用程序运行时继续运行.这需要打电话给detach().从那里,我只能提供一点点智慧......

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

  • 您正在获得用户输入,可能来自cin或类似的东西getch().如果从多个线程访问它们,则无法确保其库实现中没有竞争条件.轻轻踩踏.