Win32 : 코드 블록의 원자 실행
-
08-07-2019 - |
문제
주어진 Win32 스레드로 CPU 사용을 계산 해야하는 getsystemtime ()과 getThreadTimes ()가 두 개의 시스템 호출이 있습니다.
정확성을 위해 getSystemTime ()와 getThreadTimes ()가 모두 원자 적으로 실행되도록해야합니다. 즉, getSystemTime () & getTheRdreadTimes ()에 대한 호출 사이에 컨텍스트 스위치가 없어야합니다.
그 이유는 때때로 100% 이상의 비율 (500 분의 ~ 1)으로 끝나기 때문입니다.
두 기능 호출의 원자 실행을 어떻게 보장 할 수 있습니까?
감사합니다, Sachin
해결책
가장 좋은 방법은 컴퓨팅 스레드를 실시간 우선 순위로 할당하는 것입니다. 실시간 스레드는 다른 실시간 스레드에 의해서만 선점됩니다 (또는 실시간 우선 순위로 향상됨).
다른 팁
나는 당신이 할 수 있는지 확실하지 않습니다. 각 기능에서 기본 작업이 무엇인지 알지 못하고 Windows API 호출이 발생하기 때문에 행운을 빕니다.
100을 초과하는 백분율 만 조정하는 것이 불가능합니까?
perc = ( perc > 100.0f ) ? 100.0f : perc;
슬프게도 방법이 없습니다. Win32의 두 시스템 호출 사이에는 프로세스/스레드가 컨텍스트가 전환되는 것을 방지 할 방법이 없습니다. 그렇지 않으면 누군가가 모든 전환을 거부함으로써 시스템을 잠그는 프로세스를 구현하는 것은 사소한 일입니다.
반대 순서로 기능을 호출하면 도움이됩니까? (99%가 101%보다 낫습니다 ...)
또한이 작업을 수행하기 직전에 컨텍스트 스위치를 강요하는 경우 (예 : Sleep ()에게 호출)를 사용하면 전환 할 가능성이 줄어 듭니다. 그래도 그것이 얼마나 잘 작동하는지 모르겠습니다.