秒表运行时间线程安全

本文关键字:安全 线程 运行时间 | 更新日期: 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,如果您在错误的时间查询它,则会产生非常大的运行时间差异。)