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。別のスレッドで発生することは問題でDoWorkはありませんがpthread_kill、C++ のスレッドには同等のものはないようです。if(badhappened) return;複数の呼び出しを に入れる必要のない解決策はありDoWorkますか?

4

1 に答える 1

6

簡単に言えば:

非協調スレッドを安全に停止する方法はありません。

はい、スレッドを強制的にシャットダウンするツールがありますが、問題が発生しています。唯一の安全な方法は、終了ポリシーに同意することです。これは、書いているときにフラグを十分に頻繁にチェックすることに要約されます。

教祖からのこれについての詳細:

C++ and Beyond 2011: Scott、Andrei、Herb - 何でもお尋ねください

30:44 を参照してください。体系的かつ原則に基づいたスレッドの終了とプログラムの終了はどうなっていますか?


スレッドをキャンセルすることは、POSIX でも良い考えではありません。

pthread_cancel を使用してスレッドをキャンセルする: 良い方法か悪い方法か

于 2012-10-17T19:56:37.627 に答える