2

この単純なクラスがあるとしましょう:

class example
{
    bool m_isCanceled;
    example() : m_isCanceled(false) {}
public:
    void cancel() { m_isCanceled = true; }

    void doWork()
    {
        for (int i = 0; i < MAX_RETRIES; ++i)
        {
            // Slow
            doStuff();

            if (m_isCanceled)
            {
                return;
            }
        }
    }
}

あるスレッドを呼び出しexample::doWork()てから、しばらくexample::cancel()して別のスレッドを呼び出す場合、最初のスレッドがそれを確認するまでの時間に制限はありm_isCanceledますか?

同様の状況で、ミューテックスでm_isCanceledを保護することを提案しましたが、私の同僚は、最初のスレッドは、多くても追加の反復後に更新を確認すると述べました。これは正しいですか?

4

1 に答える 1

3

保証は一切ありません。理想的には、ブール変数をアトミックにします。それが失敗すると、volatileほとんどすべての既知のプラットフォームで動作するようになります。もちろん、ミューテックスで保護することは確実に機能します。

実際には、とにかく「うまくいく」でしょう。実装は通常、、doStuffまたはそれが呼び出す関数がを操作するかどうかを知りませんm_isCancelled。そのため、これらの呼び出し全体でレジスターなどに保持することはできません。

于 2013-01-22T19:54:39.997 に答える