私はスレッドを使用してpthreads
いて、スレッドをX秒間スリープさせようとしています。
私はsleep()
、(偽のミューテックスロックをX秒間待機する)、スレッドがウェイクアップするたびに時間をチェックして、実行する時間かどうかを確認し、最後にX秒間待機するのに忙しいことnanosleep()
を試しました。pthread_cond_timedwait()
pthread_yield()
問題は、これらの方法はすべて、結果を考慮すると正常に機能しますが、期待するパフォーマンス結果が得られないことです。パフォーマンスは、時間ではなくスループット(1秒あたりの応答数)で測定されます。
私の構成では、2つのシミュレートされた物理コア(Ubuntu Serverを実行しているVirtualBox)上で3つのソフトウェアスレッドを実行しています。3つのスレッドのうち1つをスリープ状態にすると、他の2つのスレッドには実行する専用の物理コアが1つあるため、パフォーマンスが向上することが期待されます。ただし、(すべてのアプローチで)まったく逆の動作が発生します。スリープ時間を長くすると、パフォーマンスが低下します。(スリープスレッドのワークロードは130〜300ミリ秒であることに注意してください。)
仮想化(ホストマシンには4つのコアがある)が原因でしょうか?私が使用しているメソッドが、使用しているアプローチと同じように動作するためpthread_yield
でしょうか?
どのようsleep()
にnanosleep()
実装されていますか?彼らは信号を使用していますか?シグナルハンドラーを使用した実装はalarm()
、より良いアプローチだと思いますか?電話するとどうなりますpthread_cond_wait()
か?それはどのように実装されていますか?
chrt
また、スケジュールポリシーを変更するために使用しようとしましたが、運がありませんでした。