【发布时间】:2011-06-17 08:35:03
【问题描述】:
DateTime 不能声明为 volatile,对吗?:
private DateTime _time;
public DateTime Time
{
get
{
Thread.MemoryBarrier();
return _time;
}
set
{
_time = value;
Thread.MemoryBarrier();
}
}
可以从不同的线程访问该属性,因此我想确保它们始终获得最新版本,而不使用争用(锁定)。
编辑:
- 我有一组难以创建的项目,每个项目都有一个名为 CreationTime 的 DateTime 属性,指示该项目的创建时间。它被初始化为 DateTime.UtcNow。
- 每次访问项目时,该属性都会更新为 DateTime.UtcNow。
- 有一个线程在线程计时器中及时执行,检查是否 (DateTime.UtcNow + 1 小时) > item.CreationTime,如果为真则删除该项目。
我想确保当“删除线程”进入集合时,所有项目都有其最新的“最后访问”日期时间,这样我就可以避免仅仅因为缓存保存了 a 的值而再次创建项目几毫秒:D
提前致谢。
【问题讨论】:
-
鉴于您正在实现一个缓存,该缓存会删除超过特定时间段的未使用对象,我认为
InterlockedExchange解决方案是这里的方法。 -
您知道 DateTime.Now 仅精确到 1/64 秒,对吧?如果您担心由于缓存延迟毫秒而导致的不准确性,那么您已经迷路了;您试图保持准确的数据的精度始终远低于 1/1000 秒。
-
@Eric,问题:DateTime.Now 没有列出 1/64 秒。记录在哪里?
-
@yodaj007:它也是。它说在操作系统 NT3.5 和更高版本上,精度约为 10 毫秒,或 1/100 秒。 “大约”的意思是“不完全”;允许操作系统决定适当的精度是多少。出于显而易见的原因,它通常接近线程量子。在我的机器上精确到 1/64 秒;你的机器可能更好或更糟。
-
@Eric:明白了。我计算的是 1/64 = 0.015 秒,即 15.6 毫秒。但是我没有看到“近似”这个词。谢谢。
标签: c# .net multithreading synchronization volatile