【问题标题】:Is the stopwatch thread-safe?秒表线程安全吗?
【发布时间】:2015-12-21 14:06:24
【问题描述】:

我的代码中有一部分:

private void Wait(String expectedResponse)
{
    waitTimeout = 30;
    Stopwatch sw = new Stopwatch();
    sw.Start();
    while (!inputBuffer.Contains(expectedResponse))
    {
        if (sw.Elapsed.Seconds < waitTimeout)
        {
            Thread.Sleep(1);
        }
        else
        {
            sw.Stop();
            throw new Exception("Timeout");
        }
    }
    sw.Stop();
    Console.WriteLine("SUCCESS");
}

Wait 方法在主线程中运行,有时在创建主线程的线程中运行。

而且有时程序的方法会无限循环,虽然时间(30秒)过去了,并没有产生异常。

那么,有什么问题吗? StopWatch 类不是线程安全的?如果是这样,如何重写代码?

有什么想法吗?

谢谢!

【问题讨论】:

  • 正如文档所说 (msdn.microsoft.com/ru-ru/library/…) 它不是线程安全的。
  • 我认为 Thread Sleep 会停止秒表,所以计时器甚至没有达到 1 秒!
  • 不管Stopwatch 是否是线程安全的,对于这个sn-p 的代码都没有关系。该对象未在线程之间共享。真正的问题是,inputBuffer 是什么,that 是线程安全的吗?至于没有抛出异常,那完全取决于你如何管理调用Wait的线程
  • 这能回答你的问题吗? Is Stopwatch.ElapsedTicks threadsafe?

标签: c# .net multithreading thread-safety stopwatch


【解决方案1】:

来自MSDN

线程安全

这种类型的任何公共静态成员都是线程安全的。任何实例 成员不能保证是线程安全的。

另外,我在您的代码中看不到任何线程敏感的调用/方法。您正在实例化一个线程本地 Stopwatch 并使用它。顺便说一句,Thread.Sleep(1) 将尝试阻塞 1 毫秒(但这是特定于操作系统的,Windows 将阻塞约 15 毫秒)并且线程仍然没有问题。

现在我认为您的inputBuffer 有问题,为什么因为它不是线程本地的。如果多个线程同时尝试使用它,则会导致不一致。你可以试试Stream.Synchronized 或者实现你自己的线程安全流类。

我还建议您使用逐步调试或至少使用一些断点来了解发生了什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-04
    • 2020-04-15
    • 2010-10-16
    • 2011-09-13
    • 1970-01-01
    • 2011-07-04
    • 2014-04-26
    相关资源
    最近更新 更多