秒表经过时间线程安全

时间:2013-05-09 17:48:59

标签: c# .net multithreading thread-safety

好的,我有一个相当简单的问题,我找不到简明的答案。我想知道我是否需要担心在lock()仍在运行时读取Stopwatch的已用属性时调用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(); } } 。我也研究过使用事件,但是对于这么简单的事情来说,这似乎是一个很大的开销,请告诉我,如果这是完全错误的,我应该使用事件。一些简单的代码来说明我在说什么。

GetRuntime()

在使用上述类的应用程序中说我在停止Stopwatch之前从另一个线程调用lock()我是否需要添加Stopwatch语句以确保我得到正确的数据,我不会阻止lock()继续运行。或者我认为它不需要{{1}}并且会很好。

我确实理解你理论上可以运行尽可能多的读取,我只是很好奇,因为如果改变了事情,那么经常会写入Elapsed属性后备存储。我已经阅读了很多关于线程安全的信息,但我只是在寻找澄清和确认,我确实正在考虑这个问题。

1 个答案:

答案 0 :(得分:4)

关于秒表的MSDN documentation州,“不保证任何实例成员都是线程安全的。”请注意,这里肯定存在一个理论上的漏洞,因为它在内部使用“长”滴答计数并且在32位处理器上更新长时间不是原子操作。您可能会看到部分更新(因此已损坏)的值。在Ticks碰巧超过32位边界之前你可能不会注意到,此时你可能会遇到一个非常意外的罕见错误(你可能会读取Int32.MaxValue,然后是0,然后是Int32.MaxValue + 1,如果你在错误的时刻查询它,会产生非常大的经过时间差异。)