0

まず第一に「適切」です。なぜなら、クラスからスレッドを起動するのは悪い習慣だと人々が言うと思うからです。:)だから、デストラクタで無限スレッドを停止する最良の方法は何だろうと思っています。フラグ shutdown が設定されているときに、スレッドが try で呼び出して例外をスローする関数をラッピングしますか? 古き良きint / enum?良い新しい std::atomic int? 他の何か?今私は使用します:

//in destructor I call terminate member func
void terminate()
{
    currentStatus=terminating;
    std::cout<<"trying to kill"<<std::endl;
    while (currentStatus!=terminated)
        std::this_thread::yield();
    std::cout<<"MISSION ACOMPLISHED"<<std::endl;
}

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

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

currentStatus は列挙型です:

enum status{
    active,
    terminating,
    terminated
};
4

1 に答える 1

1

「クラスからスレッドを起動するのは悪い習慣だと人々は言うだろう」 - とにかく私ではありません。オブジェクト指向言語をお持ちの場合は、他にどこから始めますか :)

yield() ループに問題があります。デストラクタを呼び出すスレッドの優先度が、終了するスレッドよりも高い場合、シングル プロセッサ システムで設計が永遠にライブロックする可能性があります。マルチコア システムでも、長い遅延が発生する可能性があります。終了するスレッドが終了前の最後のアクションとして設定するスレッド ハンドルまたは何らかのイベントを待機することをお勧めします。これにより、回避可能な CPU ループが取り除かれるだけでなく、明示的なバリアが必要になる可能性のある「ステータス」エマムのキャッシュの問題も回避されます。

Rgds、マーティン

于 2011-10-28T21:26:42.157 に答える