できるだけ正確に 10 ミリ秒間隔を維持する必要があります。
私は絶対時間ウェイクアップポイント(各ウェイクアップ後に10ミリ秒増加)とCLOCK_MONOTONICでclock_nanosleepを使用しています。
デスクトップ Ubuntu 11.04 で、起動後に呼び出された clock_gettime は、プログラムが平均 1 ミリ秒遅れて起動することを示しています。
Linuxスケジューラモードで遊んでいます:
- SCHED_IDLE、プログラムは平均 2 ミリ秒遅れてウェイクアップします
- SCHED_RR、プログラムは平均で 0.9 ミリ秒遅くウェイクアップします...
システムがアイドル状態であっても、いくつかのコピーを実行していても、結果は同じです: dd if=/dev/zero of=/dev/null 人工的な CPU 負荷の場合。
スケジューラーのパラメーター (スケジュールの最小粒度、ウェイクアップの粒度、スケジュールされたレイテンシー) を可能な限り小さくしましたが、違いはありませんでした。
他のデスクトップで試したことはありません。在庫の Ubuntu と Intel Core i5 で clock_nanosleep を使用して得られる精度が期待できるかどうか、またはシステムに問題があるかどうかはわかりません。
PS。結局のところ、このような clock_nanosleep の動作は、オーディオ デバイスにデータを配信するために非ブロッキング コールが使用される場合、オーディオ再生中のレイテンシの増加 (アンダーラン) につながります。通話をブロックした後に目を覚まします。