我有一个高度线程化的应用程序。

此应用程序中的线程从共享内存映射文件中读取。您可以假设他们从未写过信。

现在,我需要做的就是扩展它,以便读者完成对文件的读取后,它将更新共享的时间戳。即time_t last_access_time = time(NULL);
这种情况经常发生,因此,我将尽可能地寻求无锁的实现。

我该如何使用G++中的原子内置函数来设置或检查last_access_time的当前值?

例如假设我有这些类成员,并且_last_access_time初始化为time(NULL)

time_t _last_access_time;

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

void GetLastAccessTime(){
     return _last_access_time;
}

是否可以使其自由锁定?

最佳答案

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;
};

10-04 12:59