1

私が次のことをしたら

  1. 特定のファイル記述子 fd1 に対して event_add を呼び出し、タイムアウト t1 = 5 秒
  2. 1 秒後、イベントの発生を待たずに、f1 と t1 = 5 秒間 event_add を再度呼び出します。

event_add の 2 回目の呼び出しは、以前の呼び出しをキャンセルしますか? つまり、イベントが発生しない場合、タイムアウトは 5 秒ではなく 6 秒で発生しますか? または、2 つのタイムアウトがありますか? 1 つは 5 秒、もう 1 つは 6 秒です。

この動作は libevent バージョン 1 と 2 で異なりますか? これに関するドキュメントは見つかりませんでした。これはコードを読んでも理解できません。もちろん、これをテストするプログラムを書くことはできますが、プログラムはさまざまなプラットフォームで動作する必要があるため、これらの条件下での動作を説明する具体的なドキュメントがあるとよいでしょう。

4

1 に答える 1

1

公式ドキュメントの引用(イベントの保留中および保留中以外のセクションの作成) :

すでにevent_add()保留中のイベントを呼び出すと、保留中のままになり、指定されたタイムアウトで再スケジュールされます。

そのため、6 秒後にタイムアウトのためにイベントがトリガーされることが期待できます。もちろん、 の 2 つの呼び出しの間にイベント構造体 (たとえば、ファイル記述子に関連付けられている場合) でイベントが発生するとevent_add()、タイマーもリセットされます。


ただし、質問されていないアドバイスで回答を拡張するには、次の部分に注意してください。

イベントがすでに保留中の場合、 timeout を指定して再度追加しNULLevent_add()も効果はありません。

したがって、既存のイベントのタイムアウトを削除する場合は、次のいずれかを選択できます。

  1. event_add()NULLタイムアウトを に設定して直接使用する{0, 0}
  2. event_del()/でイベントを削除/追加、今回はタイムアウトevent_add()を設定NULL

私は後者をお勧めします。

于 2014-09-03T08:31:56.250 に答える