0

次のシナリオがあります。

1 つのスレッドが、クラス X のメソッド A のリスト データ構造を反復処理しています。そのデータ構造はキャッシュです。いつでも、クラス X のメソッド B が呼び出され、キャッシュが古くなっているというメッセージが表示されます。その場合、現在関数 A にいる場合は、関数 A を再起動する必要があります。これは、そのデータ構造の反復により、存在しなくなったデータを見つけることができるためです。メソッド B が同時に 2 回呼び出されることはありません (メソッド A は完了するまでに時間がかかります)。

これは可能ですか?私はC++で作業しています。キャッシュを単にロックするだけでは不十分であることに注意してください。キャッシュをロックし、キャッシュが古くなっているという呼び出しを受けた場合、適切な動作のために関数 A をすぐに再起動する必要があります。

これは正しく動作しませんが、必要なものを表示しようとします:

Class X
{
    Method A
    {
        for each //data structure
        {
            // do processing

            // check if our cache is out of date
            if(mRestart)
            {
                while(!mReadyToStart)
                    ; //wait

                mRestart = false;
                mReadyToStart = false;

                //Break, and call something that will recall this function.
            }                
            else
                return result; //return means we never needed to restart.
        }
    }

    Method B
    {
        mRestart = true;

        //Do processing

        mReadyToRestart = true;            
    }

    bool mRestart; // Init to false in constructor
}
4

1 に答える 1

2

同期メカニズムを使用して、作業中のmRestartmReadyToRestartメンバー、およびデータ構造を同時アクセスから保護する必要があります。

特定のニーズ、OS、およびビルド環境に応じて、C++ でこれを実現するために、C++11 標準ミューテックスまたは条件変数、またはその他の低レベル OS メソッド、またはフレームワーク (boost::thread など) を使用できます。

于 2013-07-10T17:28:11.427 に答える