2013-10-06 2 views
0

я начал экземпляр Stopwatch и хотел бы, чтобы прочитать это ElapsedMilliseconds из другого потока:Будет ли чтение секундомера.ИзмереныМиллисекунды из другого потока дают правильное значение?

var diff = myStopwatch.ElapsedMilliseconds - someOtherValue; 

Однако я прочитал компилятор оптимизирует код при условии, что работает на тот же поток, что может привести к указанным выше линиям считывая значение из реестра, а затем получая фактическое значение в точный момент времени, когда он выполняется. Это повлияет на меня? Если да, то как мне обойти это?

ответ

2

Секундомер pinvokes QueryPerformanceCounter() winapi function, оптимизация не влияет на это каким-либо образом. Функция winapi зависит от HAL, уровня аппаратной абстракции, чтобы обеспечить источник счетчика. Наиболее типично счетчик, доступный в наборе микросхем. На разных машинах используются разные чипсеты, причина в том, что свойство Stopwatch.Frequency открыто. И соответственно различные реализации HAL, поэтому не может быть твердой гарантии, что на вашей материнской плате нет коути. Корпорация Майкрософт покрывает эту ответственность с помощью этой заметки в статье MSDN:

На многопроцессорном компьютере не должно иметь значения, какой процессор вызывается. Тем не менее, вы можете получить разные результаты на разных процессорах из-за ошибок в базовой системе ввода/вывода (BIOS) или слоя абстракции аппаратного обеспечения (HAL). Чтобы указать сродство процессора к потоку, используйте функцию SetThreadAffinityMask.

Эти ошибки были не совсем необычными 20 лет назад, неслыханными сегодня.

Смежные вопросы