秒表运行时间线程安全
本文关键字:安全 线程 运行时间 | 更新日期: 2023-09-27 18:12:48
好吧,我有一个相当简单的问题,我找不到一个简洁的答案。我想知道我是否需要担心在读取Stopwatch
的经过属性时调用lock()
语句,而它仍在运行。
也是一个Stopwatch
,我应该用来衡量一个线程的运行时间。我在其他类似的问题中读到过可以使用DispatchTimer
。我也研究了使用事件,然而,这似乎是很多开销的东西这么简单,请告诉我,如果这只是简单的错误,我应该使用事件。一些简单的代码来说明我所说的内容。
class foo
{
private bool _isRunning { get; set; }
private Stopwatch sw { get; set; }
public void StartThread()
{
this._isRunning = true;
new Thread(new ThreadStart(this.DoWork)).Start();
this.sw.Restart();
}
public void StopThread()
{
this._isRunning = false;
this.sw.Stop();
}
private void DoWork()
{
while(this._isRunning)
{
//Do Stuff
}
}
public TimeSpan GetRuntime()
{
return this.sw.Elapsed;
}
public foo()
{
_isRunning = false;
sw = new Stopwatch();
}
}
假设在使用上述类的应用程序中,我要在停止Stopwatch
之前从不同的线程调用GetRuntime()
,我需要添加lock()
语句以确保我获得正确的数据,并且我不会阻止Stopwatch
继续运行。或者我认为它不需要lock()
并且会很好,这是正确的吗?
我确实理解,理论上你可以运行尽可能多的读取,我只是好奇的是,如果改变了事情,我只是好奇的是,过去的属性支持存储不断被写入。我读了很多关于线程安全的信息,但我只是在寻找一个澄清和确认,我确实在正确地考虑这一点。
MSDN文档指出,关于Stopwatch,"不能保证任何实例成员都是线程安全的。"请注意,这里绝对存在理论上的漏洞,因为它在内部使用"长"滴答计数,并且在32位处理器上更新长并不是原子操作。您可能会看到部分更新(因此损坏)的值。您可能不会注意到,直到Ticks碰巧超过32位边界,此时您可能会遇到一个非常意外的罕见错误(您可能会读取Int32)。MaxValue,后面跟着0,后面跟着Int32。MaxValue + 1,如果您在错误的时间查询它,则会产生非常大的运行时间差异。)