[英]abort() is called when I try to terminate a std::thread
注意:我使用的是 WinForms 和 C++17。
所以我在做一个学校项目。 我有这个 function:
bool exs::ExprSimplifier::simplify()
{
bool completed = false;
std::thread thread1(&ExprSimplifier::internalSimplity, this, std::ref(completed));
while (true)
{
if (completed)
{
thread1.~thread(); // calls abort()
return true;
}
if (GetAsyncKeyState(27))
{
thread1.~thread(); // calls abort()
return false;
}
}
}
基本上我想要的是运行以下 function:
// at the end of this function, I set completed = true
void exs::ExprSimplifier::internalSimplity(bool& completed)
..在另一个线程上。 我还想检查函数正在执行的操作并且用户按下了esc
键,线程终止。 但是我遇到了一些问题。 这个:
thread1.~thread();
..正在调用abort()
,导致应用程序崩溃。 现在我认为这是由于std::thread
的一些 scope 的事情,但我不太确定。
你不能终止线程 - 故事结束。 过去,他们试图让你可以终止线程,但他们意识到不崩溃是不可能的,所以现在你不能。 (Eg Windows had a TerminateThread
function, because it's old. C++ doesn't have it, because C++ threads are new)
你唯一能做的就是设置一个变量告诉线程停止,然后等待它停止。
~thread
无论如何都不会终止线程。 它所做的只是检查您是否记得调用join
或detach
,如果您忘记调用其中之一,它会中止,如您所见。
您通常想要做的是沿着这条一般路线做的事情:
class doWhatever {
std::atomic<bool> stop {false};
std::thread t;
public:
void run() {
t = std::thread([] {
while (!stop) {
doSomeProcessing();
}
});
}
void stop() {
stop = true;
}
~doWhatever() {
if (t.joinable())
t.join();
}
};
您将在doSomeProcessing
中执行的操作显然取决于您真正希望线程执行的操作。 一些线程有一个传入任务队列,并在处理每个传入任务之前检查变量。 其他人有一项漫长的任务要做,但如果他们这样做,通常会有一些循环,您可以在每次迭代时检查变量。
至少在我看来,在很多情况下,理想的情况是检查您是否被要求每隔 100 毫秒关闭一次。 这提供了一个很好的平衡——对于一个人来说,在 100 毫秒的时间内关闭它并告诉它看起来几乎是瞬时的,但你仍然不经常检查它,以至于它不会影响执行速度到足以引起注意。
如果您有足够新的编译器来支持它,您可能更喜欢使用std::jthread
而不是std::thread
。 它基本上包括线程 object 中的std::atomic<bool>
的等效项。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.