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()
.如果从多个线程访问它们,则无法确保其库实现中没有竞争条件.轻轻踩踏.