あなたの場合の主な問題が何であるかを言うのは難しいですが、sched_yield()
orへの呼び出しで修正できるものではないことは間違いありませんpthread_yield()
。Linux での譲歩の明確に定義された唯一の使用法は、別の準備完了スレッドが、SCHED_FIFO スケジューリング ポリシーの下で、同じ CPU 上の同じ優先度で、現在 CPU にバインドされている実行中のスレッドをプリエンプトできるようにすることです。これは、ほとんどすべての場合に不適切な設計上の決定です。
Linux で「リアルタイムであることを試みる」という目標を真剣に考えている場合は、まず、リアルタイムsched_setscheduler
設定 (SCHED_FIFO または SCHED_RR、FIFO を推奨) を使用する必要があります。次に、Linux 用の完全なプリエンプション パッチを取得します (お使いのディストリビューションで提供されていない場合は、 kernel.orgから入手してください。これにより、デバイス ドライバー スレッドのスケジュールを変更したり、ハード ディスクやイーサネット ドライバー スレッドよりも高いスレッドを実行したりすることもできます)。第 3 に、RTWikiやその他のリソースを参照して、リアルタイム アプリケーションを設計および設定する方法に関するヒントをさらに確認してください。
これは、適切なデスクトップ システムのシステム負荷に関係なく、応答時間を 10マイクロ秒未満にするのに十分なはずです。私は組み込みシステムを使用しており、アイドル状態で 60 us の応答を絞り出し、ディスク/システムの負荷が高い場合は 150 us しか絞り出しませんが、それでもあなたが説明しているよりも桁違いに高速です。