私は、非常に重い CPU 作業 (すべて数学と計算) を実行する C++ ライブラリを作成しました。独自のデバイスに任せると、利用可能なすべての CPU リソースの 100% を簡単に消費します (利用可能な論理リソースの数までマルチスレッド化されています)。マシン上のコア)。
そのため、ライブラリを使用するソフトウェアが呼び出すことになっているメインの計算ループ内にコールバックがあります。
while(true)
{
//do math here
callback(percent_complete);
}
コールバックで、クライアントは Sleep(x) を呼び出してスレッドを遅くします。
元々、クライアント側のコードは固定の Sleep(100) 呼び出しでしたが、一部のマシンは他のマシンよりも速く計算を終了するため、信頼性の低いパフォーマンスが低下しましたが、スリープはすべてのマシンで同じです。したがって、クライアントはシステム時間をチェックし、1 秒以上 (== 数回の反復) が経過した場合、0.5 秒間スリープします。
これは、スレッドを遅くする許容可能な方法ですか? パフォーマンスを最大化するには、Sleep() の代わりにセマフォ/ミューテックスを使用する必要がありますか? 処理の 1 秒ごとに x ミリ秒のスリープは問題ありませんか、それとも私が気づいていない何か問題がありますか?
私が尋ねた理由は、タスクマンがプロセスが CPU の約 10% を占めていることを示しているにもかかわらず、マシンがまだひどく動かなくなっているからです。私はすでにハードディスクとメモリの競合を無駄に調査したので、スレッドを遅くしている方法がこの問題を引き起こしているのではないかと思っています.
ありがとう!