2011-12-09 9 views
0

QueryPerformanceCounter에 액세스하여 루틴 실행 시간을 기록하는 코드가 있습니다. 대략 :중요한 섹션이있는 Int64 's에 대한 액세스를 래핑해야합니까?

var 
    FStart, FStop : Int64 ; 
... 
QueryPerformanceCounter (FStart) ; 
... <code to be measured> 
QueryPerformanceCounter (FStop) ; 

<calculate FStop - FStart, update minimum and maximum execution times, etc> 

로깅이 코드의 일부는 내부 스레드이지만, 반면에 유도 된 결과에 액세스하는 UI 디스플레이가있다. 로깅 코드가 액세스하는 동일한 변수에 VCL 스레드가 액세스 할 가능성이 있다는 것을 알았습니다. VCL은 오직 데이터를 읽습니다 (그리고 맹 글링 된 읽기는 너무 심각하지 않습니다). 그러나 로깅 코드는 때때로 다른 스레드에서 데이터를 읽고 씁니다.

QueryPerformanceCounter 자체가 스레드로부터 안전하다고 가정합니다.

코드는 문제의 징후없이 행복하게 실행되었지만 중요한 섹션의 Int64 카운터에 내 액세스를 래핑해야하는지 궁금합니다.

또한 중요한 섹션 액세스 속도가 얼마나되는지 궁금합니다.

답변

1

읽기 및 쓰기가 모두 관련되어있을 때 다중 바이트 비 원자 데이터에 액세스 할 때마다 액세스를 직렬화해야합니다. 중요한 섹션, 뮤텍스, 세마포어, SRW 잠금 등을 사용 하느냐는 당신에게 달려 있습니다.

+0

확인. 하나의 스레드 만이 데이터를 쓰는 사실을 이용하지 못합니까? 물론 데이터를 읽는 다른 스레드가 부분적으로 업데이트 된 값을 읽을 수도 있지만이 응용 프로그램에서는 너무 많은 결과가 없습니다 (읽기 스레드는 항상 표시를 위해 데이터를 읽는 VCL 스레드이며 매초마다 새로 고칩니다). 내가 더 걱정하고있는 일은 갈등을 일으키는 갈등입니다. 액세스를 관리하는 데 소요되는 시간이 타이밍 오버 헤드이므로 액세스 시간을 직렬화해야하는 경우 중요합니다. 다음 중 가장 낮은 (시간) 오버 헤드를 갖는 옵션은 무엇입니까? – rossmcm

+0

당신이하고있는 일이'Int64' 값을 표시하고 그 외에는 아무것도하지 않으면, 데이터를 직렬화 할 필요가 없습니다. 실제로 가치에 따라 행동했다면 무결성을 보장하기 위해 액세스를 직렬화해야합니다. –