poll.poll()関数によってブロックされているスレッドをウェイクアップする方法がありません。誰かが私を助けてもらえますか?
3 に答える
これを処理する方法は、追加のファイル記述子を poll() に渡される記述子のリストに含めることです。その記述子については、読み取りの準備が整うまで待ちます。poll() を待機しているスレッドを目覚めさせたい他のスレッドに、その追加の記述子に書き込みます。その時点で、 poll() を呼び出したスレッドは実行を再開し、余分な記述子がそれを目覚めさせたものであることを確認し、何でもします。
この余分なファイル記述子を最初に取得する通常の方法は、無名のパイプを pipe() で開くことです。1 つは poll() で読み取り待機を渡し、もう 1 つは poll() で待機しているスレッドを目覚めさせるために書き込みます。
タイムアウトになる前に、ブロッキング poll(2) または select(2) を起こしたい正当な理由はたくさんあります。ポーリングされている fd リストにソケットを追加または削除する必要があるときはいつでも、待機から抜け出す必要があります。タイムアウトに依存する場合、タイムアウトを短くして応答性を高める必要がありますが、タイムアウトを短くすると、多くの不必要なスラッシングが発生する可能性があります。
とにかく Linux の場合、eventfd(2)を使用してファイル記述子を作成し、fd リストに追加できます。待機から抜け出す必要がある場合は、eventfd に書き込みます。
ポーリング呼び出しでタイムアウトを使用して、無期限にブロックしないようにします。注意: タイムアウト値はミリ秒単位です。