从不同的线程读取秒表.经过毫秒会给出正确的值吗?

本文关键字:线程 读取 取秒 经过 | 更新日期: 2023-09-27 18:34:01

我已经启动了秒表的一个实例,并希望从另一个线程读取它的已用毫秒数:

var diff = myStopwatch.ElapsedMilliseconds - someOtherValue;

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

从不同的线程读取秒表.经过毫秒会给出正确的值吗?

表调用 QueryPerformanceCounter(( winapi 函数,优化不会以任何方式影响它。 winapi 函数依赖于 HAL,即硬件抽象层来提供计数器源。 最常见的是芯片组中可用的计数器。 不同的机器使用不同的芯片组,这是秒表.频率属性暴露的原因。 因此,不同的 HAL 实现,因此无法硬性保证您的主板没有 cooties。 Microsoft MSDN 文章中的以下注释涵盖了该责任:

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

这种错误在20年前并不完全罕见,今天闻所未闻。