1

高度にスレッド化されたアプリがあります。

このアプリのスレッドは、共有メモリ マップ ファイルから読み取ります。彼らがそれに書き込むことはないと想定できます。

ここで必要なのは、リーダーがファイルからの読み取りを終了したときに共有タイムスタンプを更新するように拡張することです。すなわちtime_t last_access_time = time(NULL);

これは非常に頻繁に発生するため、可能であればロックのない実装を探したいと思います。

last_access_timeG++ でアトミック ビルトインを使用して現在の値を設定または確認するにはどうすればよいですか?

たとえば、これらのクラスメンバーがあり、_last_access_time初期化されているとしますtime(NULL)

time_t _last_access_time;

void UpdateLastAccessTime(){
     _last_access_time = time(NULL);
}

void GetLastAccessTime(){
     return _last_access_time;
}

ロックフリーにすることは可能ですか?

4

1 に答える 1

4
class SomeClass
{
public:
    inline
    SomeClass ()
        : m_lastAccessTime (0)
    { ; }

    inline void
    UpdateLastAccessTime ()
    {
        time_t crtTime = time (NULL);
        time_t lastTime = m_lastAccessTime;

        while (crtTime > lastTime)
        {
            lastTime = __sync_val_compare_and_swap (
                &m_lastAccessTime,
                lastTime,
                crtTime);
        }
    }

    inline time_t
    GetLastAccessTime () const
    {
         return m_lastAccessTime;
    }

private:
    volatile time_t m_lastAccessTime;
};
于 2011-02-19T07:28:48.927 に答える