2017-06-16 1 views
0

私がlibeventで作成したほとんどのアプリケーションには、1つの読み取りコールバックが含まれています。新しい接続が要求に対して開かれたときは、::event_new()という新しいイベントを割り振り、::event_add()libeventでコールバックを共有する方法

しかし、この問題は、新しいリクエストが開かれるたびにメモリを割り当ててイベントループに追加することです。実際にはファイル記述子のコールバックとイベントを共有する必要があります。許可されたメモリ割り当てはそのようなアプリケーションのボトルネックではありません。libeventは複数のファイル記述子でイベントを共有する方法を提供していますか?

+1

あなたの質問で「ファイル記述子の共有コールバックとイベント」とは何を意味していますか?処理のために接続の状態を保存するためには、メモリの割り当てが避けられません。 'event'は他のイベントと全く異なる状態を持っています。異なる機能を実現するためにどのように共有できますか?そして、 'ファイルディスクリプタ'が使用されていない(閉じられている)ときは 'select'、' poll'、 'epoll'などのためにOSで再利用されます。何をしたいのですか? – Azeem

+0

@Azeem私が読んだすべてのイベントは、彼らが待っているファイル記述子を除いて同じであるので尋ねた – Curious

+0

コード例を挙げることはできますか?いくつかのサポートコード例で質問をうまく編集してください。 – Azeem

答えて

1

ファイル記述子間でイベントを共有しないでください。それはあなたのアプリに混乱を引き起こすでしょう。 event_new()は、ファイル記述子に添付されたイベントを作成します。

event_assign()を使用して、使用済みイベントを再割り当てすることはできますが、libeventドキュメントでは、これが推奨されないと具体的に述べられています。さらに、使用済みのイベントをある種のプールで管理することは、それほど簡単ではないかもしれません。おそらく目立ったパフォーマンスの向上はないでしょう。

+0

あなたはカオスを意味するものの例を挙げることができますか?私が作成するすべての読み取りイベントは、指定されたファイル記述子を除いて同じです。ここで正しい使用法のパターンを理解しようとしています – Curious

+0

イベントはソケットに縛られ、そのソケットのイベントで発生します。複数のアクティブなソケットにイベントをアタッチすると、未定義の動作につながります。つまり、あなたのプログラムはすぐに爆発するか、または定義されていない方法で動作します。つまり、間違ったソケットで発生したイベント、デッドソケット、メモリリーク、トレース不可能なようなあらゆる種類のバグが発生する可能性がありますメモリ破損などがあります。 –

関連する問題