5

我有几个工作函数,它们调用可能会发生不好的事情的附属函数。如果辅助功能确定发生了不好的事情,我希望能够停止工作功能,而无需在工作功能中进行大量标志检查。例如,

struct Worker {
    bool badhappened = false;
    Worker() {
        std::thread([&]() {
            while ( not badhappened );
            // kill the work
        }).detach();
    }
    int WorkComponent {
        if ( badhappening() )
            badhappened = true;
        return someint;
    }
    void DoWork {
        // WorkComponents called several times
    }
}

但我不知道该打什么电话kill the work。在单独的线程中发生不是问题,但在 C++ 的线程中DoWork似乎没有等价物。pthread_kill有没有不涉及多次if(badhappened) return;调用的解决方案DoWork

4

1 回答 1

6

长话短说:

没有安全的方法来停止非合作线程。

是的,有一些工具可以强行关闭线程,但你是在自找麻烦。唯一安全的方法是就终止政策达成一致。这归结为在您编写时足够频繁地检查标志。

来自大师的更多信息:

C++ 和超越 2011:Scott、Andrei 和 Herb - 问我们任何问题

见30:44 有系统有原则的线程终止和程序终止是怎么回事?


在 POSIX 中取消线程也不是一个好主意:

使用 pthread_cancel 取消线程:好的做法或坏的做法

于 2012-10-17T19:56:37.627 回答