1

特定の Win32 スレッドによる CPU 使用率を計算するために必要な 2 つのシステム コール GetSystemTime() と GetThreadTimes() があります。

正確を期すために、GetSystemTime() と GetThreadTimes() の両方がアトミックに実行されるようにする必要があります。つまり、GetSystemTime() と GetThreadTimes() の呼び出しの間にコンテキスト スイッチがあってはなりません。

その理由は、ときどき 100% を超えるパーセンテージ (~ 500 分の 1) になるからです。

2 つの関数呼び出しをアトミックに実行するにはどうすればよいですか?

ありがとう、サチン

4

4 に答える 4

2

あなたの最善の策は、計算スレッドにリアルタイムの優先順位を割り当てることです。リアルタイム スレッドは、他のリアルタイム スレッド (またはリアルタイム優先度に上げられたスレッド) によってのみプリエンプトされます。

于 2008-11-13T21:59:47.400 に答える
2

私はあなたができるかどうか確信が持てません。各関数の基になる操作が何であるかを知っていない限り、それらはたまたま Windows API 呼び出しであるため、幸運を祈ります。

100 を超えるパーセンテージだけを調整することはできないのでしょうか?

perc = ( perc > 100.0f ) ? 100.0f : perc;
于 2008-11-13T21:29:30.113 に答える
1

残念ながら仕方がありません。Win32 の 2 つのシステム コールの間に、プロセス/スレッドがコンテキスト スイッチ アウトされるのを防ぐ方法はありません。そうでなければ、システムをロックダウンするプロセスを誰かが実装して、すべての切り替えを拒否するのは簡単なことです。

于 2008-11-13T21:30:22.840 に答える
1

関数を逆の順序で呼び出すと役立ちますか? (99% は 101% より優れています...)

また、これを行う直前にコンテキスト スイッチを強制すると (たとえば、Sleep() を呼び出して)、スイッチ アウトされる可能性が低くなります。それがどれほどうまくいくかはわかりませんが。

于 2008-11-13T21:45:14.073 に答える