【问题标题】:Will reading Stopwatch.ElapsedMilliseconds from a different thread give the correct value?从不同的线程读取 Stopwatch.ElapsedMilliseconds 会给出正确的值吗?
【发布时间】:2013-10-06 05:36:39
【问题描述】:

我已经启动了Stopwatch 的一个实例,并想从另一个线程读取它的 ElapsedMilliseconds:

var diff = myStopwatch.ElapsedMilliseconds - someOtherValue;

但是我已经阅读了编译器优化代码,假设它运行在同一个线程上,这可能导致上面的行从注册表中读取一个值,而不是在它执行的精确时间点获取实际值。这会影响我吗?如果是这样,我该如何解决?

【问题讨论】:

    标签: c# multithreading stopwatch


    【解决方案1】:

    秒表调用QueryPerformanceCounter() winapi function,优化不会以任何方式影响它。 winapi函数依赖HAL,硬件抽象层提供计数器源。最典型的是芯片组中可用的计数器。不同的机器使用不同的芯片组,这就是 Stopwatch.Frequency 属性暴露的原因。并且相应地不同的 HAL 实现,因此不能硬保证您的主板没有 cooties。 Microsoft 在 MSDN 文章中通过以下说明来承担该责任:

    在多处理器计算机上,调用哪个处理器并不重要。但是,由于基本输入/输出系统 (BIOS) 或硬件抽象层 (HAL) 中的错误,您可能会在不同的处理器上获得不同的结果。要为线程指定处理器亲和性,请使用 SetThreadAffinityMask 函数。

    这类错误在 20 年前并不少见,而在今天则闻所未闻。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-19
      • 2018-07-19
      相关资源
      最近更新 更多