我有一个高度线程化的应用程序。
此应用程序中的线程从共享内存映射文件中读取。您可以假设他们从未写过信。
现在,我需要做的就是扩展它,以便读者完成对文件的读取后,它将更新共享的时间戳。即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;
};