繁体   English   中英

当我尝试终止 std::thread 时调用 abort()

[英]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 的事情,但我不太确定。


问题:

  1. 这是什么原因?
  2. 我能做些什么来解决这个问题?

你不能终止线程 - 故事结束。 过去,他们试图让你可以终止线程,但他们意识到不崩溃是不可能的,所以现在你不能。 (Eg Windows had a TerminateThread function, because it's old. C++ doesn't have it, because C++ threads are new)

你唯一能做的就是设置一个变量告诉线程停止,然后等待它停止。

~thread无论如何都不会终止线程。 它所做的只是检查您是否记得调用joindetach ,如果您忘记调用其中之一,它会中止,如您所见。

您通常想要做的是沿着这条一般路线做的事情:

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.

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