В многопоточном приложении как бы я использовал атомарные встроенные функции для установки / просмотра значения time_t? - PullRequest
1 голос
/ 19 февраля 2011

У меня есть приложение с многопоточностью.

Потоки в этом приложении читают из сопоставленного файла общей памяти.Вы можете предположить, что они никогда не пишут в него.

Теперь мне нужно расширить его так, чтобы, когда считыватель закончил чтение из файла, он обновил общую метку времени.то есть time_t last_access_time = time(NULL);

Это случается так часто, что я бы предпочел искать реализацию без блокировки, если это вообще возможно.

Как бы я мог установить или проверить текущее значениеlast_access_time с использованием атомарных встроенных функций в G ++?

например, предположим, у меня есть эти члены класса и _last_access_time инициализируется в time(NULL)

time_t _last_access_time;

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

void GetLastAccessTime(){
     return _last_access_time;
}

Можно ли сделать его свободным от блокировки

1 Ответ

4 голосов
/ 19 февраля 2011
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;
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...