c ++ - GetThreadtimes giver mærkelige resultater

Indlæg af Hanne Mølgaard Plasc

Problem





Jeg overvåger en tråd ved hjælp af GetThreadTimes hver 5 microsec (mere eller mindre)

Denne tråd er 'Sleeping' i 1 minut, men af ​​en eller anden grund bliver 'Bruger Tid' ofte fra GetThreadTimes ændringer, selv om tråden stadig er i dvaletilstand.

Kernel tid er altid 0.


Er der nogen der ved, hvorfor det sker?

tak :)

Bedste reference


Det er ikke fuldstændigt svar, men alligevel her er der mindst to grunde:



  1. Der er kendt problem 'Tråd prioriteringsinversion', for detaljer se link, men meget nyttig teknik til at løse problemet er tilfældige boosting tråde. Så der er mulighed for, at tråden får nogle processor tid. [7]

  2. Trådslid kan implementeres som en loop med periodisk kontrol af tidsudløbstilstand.


Andre referencer 1


5 Microseconds ?!


GetThreadTimes() måler antallet af kvanter, en tråd har brugt i søvn, bruger/kernel-tilstand. Jeg har observeret et typisk tidsplanskvantum på 10-15 ms på Win32. Under en kvante finder du tiderne GetThreadTimes() -rapporterne ikke ændres - det multiplicerer i grunden blot (heltal) antallet af forløbne kvanter (i hver tilstand) med varigheden af ​​et kvantum.


Under 10-15 ms kan du virkelig ikke forvente, at nogen af ​​de værdier, der returneres af GetThreadTimes(), er korrekte. MEGET ofte, vil du kun se en af ​​de tre målte værdier, der opdateres ad gangen; præcis som du diskuterede.


Både Linux og Win32 har quirky tråd runtime rapporteringsadfærd i den skala, du diskuterer. De eneste operativsystemer, jeg har fundet der virkelig kan måle planlagt udførelsestid ned til 5 microseconds, er Mac OS X og VxWorks - QNX har sandsynligvis også denne mulighed.

Andre referencer 2


Fra MSDN: Trådoprettelse og udgangstider er point i tiden udtrykt som den tid, der er gået siden midnat den 1. januar 1601 i Greenwich, England. Der er flere funktioner, som en applikation kan bruge til at konvertere sådanne værdier til mere generelt nyttige formularer; se tidsfunktioner.


Så det kunne vise gange, da du forlod tråden.