クラスデストラクタからデーモンスレッドを停止する "適切な"方法

まず第一に「適切」です。なぜなら、クラスからスレッドを起動することは悪い習慣であると私は人々に教えてくれると考えているからです。 :) だから私はデストラクタで無限のスレッドを停止する最善の方法は何ですか?フラグのシャットダウンが設定されているときに、スレッドがtryで呼び出して例外をスローするラッピング機能はありますか?ちょうど良い古いint/enum?良い新しいstd :: atomic int?他に何か? 今私は使用します:

//in destructor I call terminate member func
void terminate()
{
    currentStatus=terminating;
    std::cout<<"trying to kill"<

スレッドが実行する関数は次のとおりです。

while (currentStatus==active)
{
//...
}
currentStatus=terminated;

currentStatusは列挙型です:

enum status{
    active,
    terminating,
    terminated
};
0

1 答え

とにかく、私はクラスからスレッドを起動することは悪い習慣であると人々が私に教えてくれるだろうと推測します。あなたがOO言語を持っているなら、あなたはどこから始めるでしょうか:)

yield()ループに問題があります。デストラクタを呼び出すスレッドが終了するスレッドよりも優先順位が高い場合、シングルプロセッサシステムで永久に設計をライブロックすることができます。マルチコアシステムであっても、遅延が長くなることがあります。終了する前にスレッドハンドルまたは終了スレッドが最後のアクションとして設定するイベントを待つ方がよい。回避可能なCPUループを排除するだけでなく、明示的な障害を必要とする可能性のある「ステータス」エミュムでのキャッシュ問題も回避します。

Rgds、 マーティン

1
追加された