Win32:コードブロックのアトミック実行
-
08-07-2019 - |
質問
2つのシステムコールGetSystemTime()およびGetThreadTimes()があり、特定のWin32スレッドによるCPU使用率を計算する必要があります。
正確を期すために、GetSystemTime()とGetThreadTimes()の両方がアトミックに実行されるようにする必要があります。つまり、GetSystemTime()と&の呼び出しの間にコンテキストスイッチが存在しないようにする必要がありますGetThreadTimes()。
理由は、100%(500分の1)を超える割合になることがあるためです。
2つの関数呼び出しをアトミックに実行するにはどうすればよいですか
ありがとう、 サチン
解決
最善の策は、コンピューティングスレッドにリアルタイムの優先度を割り当てることです。リアルタイムスレッドは、他のリアルタイムスレッド(またはリアルタイム優先度にブーストされたスレッド)によってのみプリエンプトされます。
他のヒント
私はあなたができるかどうかわからない。基礎となる操作が各関数で何であるかがわからない限り、それらはたまたまWindows API呼び出しであるため...幸運を祈ります。
100を超えるパーセンテージを調整することはできませんか?
perc = ( perc > 100.0f ) ? 100.0f : perc;
残念ながら方法はありません。 Win32の2つのシステムコールの間に、プロセス/スレッドがコンテキストスイッチアウトされるのを防ぐ方法はありません。そうしないと、スイッチアウトするたびに拒否することでシステムをロックダウンするプロセスを実装するのは簡単です。
逆の順序で関数を呼び出すと役に立ちますか? (99%は101%よりも優れています...)
また、これを行う直前にコンテキストの切り替えを強制する場合(たとえば、Sleep()を呼び出すことにより)、おそらく切り替えられる可能性を減らすことができます。しかし、それがどれだけうまくいくかはわかりません。