select()は優れたシステムコールです。ファイル記述子、ソケット記述子、パイプなどをいくつでもパックして、入力が利用可能になったときに同期的に通知を受け取ることができます。
インターバル/ワンショットタイマーを作成してselect()で使用する方法はありますか?これにより、IOとタイミングに複数のスレッドを使用する必要がなくなります。
select()は優れたシステムコールです。ファイル記述子、ソケット記述子、パイプなどをいくつでもパックして、入力が利用可能になったときに同期的に通知を受け取ることができます。
インターバル/ワンショットタイマーを作成してselect()で使用する方法はありますか?これにより、IOとタイミングに複数のスレッドを使用する必要がなくなります。
timerfd_createはまさにこれを行います。これはLinuxカーネルにかなり最近追加されたものであり、まだすべてのディストリビューションで利用できるわけではないかもしれません。
タイムアウトパラメータを使用します-タイマーイベントを優先キューに保持し、一番上の項目をチェックし、それに応じてタイムアウトを設定します-タイムアウトに達した場合は、イベントを実行する準備ができていることを確認し、イベントを実行して続行できます。
少なくともそれは私がしていることです。
ポーリングは(いくつかの点で)より優れたインターフェースを備えており、多くのファイル記述子を使用するとより効率的になる可能性があることに注意してください。
MarkRには優れたポータブルソリューションがありますが、別のソリューションがあります。
POSIXタイマー()を使用すると、問題を「 -ablesignals timer_create」に変換できます。selectこの問題には古典的な解決策があります。シグナルハンドラーからパイプに書き込み、パイプselectの読み取り側でingします。
@MarkRに基づいて構築され、ソートされた構造を使用して、intとintへのポインターを持つcallback+closureを格納します。2つのintの値が同じである場合、イベントはアクティブです。それ以外の場合、イベントは破棄されます。
このように、intを増やすだけでイベントを破棄できます。おそらく最も簡単な解決策ではありませんが、私が考えることができたのはそれだけでした。
https://github.com/cheako/tor2web/tree/6ac67f80daaea01d14a5d07e6026e1af4258dc96/src
hextree.c contains the code for the data structure used.
schedule.c:156 is where the int is changed.
gnutls.c:197 is where the timers are created.