2013-10-06 6 views
0

내가 Stopwatch의 인스턴스를 시작하고 다른 스레드에서 ElapsedMilliseconds있어 읽고 싶은 :다른 스레드에서 Stopwatch.ElapsedMilliseconds를 읽으면 올바른 값이 제공됩니까?

var diff = myStopwatch.ElapsedMilliseconds - someOtherValue; 

내가 컴파일러를 읽고 그러나 코드는 위의 라인을 초래할 수 동일한 스레드에서 실행되는 가정 최적화 레지스트리에서 값을 읽는 대신 실행 된 정확한 시점에서 실제 값을 얻습니다. 이것은 나에게 영향을 미칠 것인가? 그렇다면 어떻게 해결할 수 있습니까?

답변

2

스톱워치는 QueryPerformanceCounter() winapi function을 표시하지 않습니다. 최적화는 어떤 식 으로든 영향을주지 않습니다. winapi 함수는 카운터 원본을 제공하는 하드웨어 추상화 계층 인 HAL에 따라 다릅니다. 가장 일반적으로 칩셋에서 사용할 수있는 카운터. 다른 기계는 Stopwatch.Frequency 속성이 노출 된 이유가 다른 칩셋을 사용합니다. 따라서 HAL 구현이 다르기 때문에 마더 보드에 cooties가 없다는 것을 보장 할 수 없습니다. Microsoft는 MSDN 문서에서이 참고로이 책임을 처리합니다.

멀티 프로세서 컴퓨터에서 호출되는 프로세서는 중요하지 않습니다. 그러나 기본 입/출력 시스템 (BIOS) 또는 하드웨어 추상화 계층 (HAL)의 버그로 인해 서로 다른 프로세서에서 다른 결과를 얻을 수 있습니다. 스레드에 대한 프로세서 선호도를 지정하려면 SetThreadAffinityMask 함수를 사용하십시오.

이러한 종류의 버그는 20 년 전만해도 전례가 없었습니다.