12

epoll(エッジトリガー)および非ブロッキングソケットを使用してマルチスレッドサーバーを作成しています。現在、メインスレッドでイベントループを作成して通知を待っていますが、正しく機能
するため、マルチスレッドにするために2つのアプローチから選択する必要があります。

  1. 各スレッドのイベントループを作成し、サーバーソケットのファイル記述子を追加して、各スレッドで通知を探します。(それは可能ですか?つまり、epollはスレッドセーフですか?)
  2. 単一のイベントループを作成し、通知を待ちます。通知を受信するたびに、それを処理するスレッドを生成します。

最初の方法を使用した場合、複数のスレッドが同じイベントで通知を受ける可能性はありますか?この状況にどのように対処できますか?

最善のアプローチは何でしょうか?ありがとうございました。

4

5 に答える 5

5

ノンブロッキング IO の主な目的は、スレッドの作成と破棄のオーバーヘッドを回避することであるため、オプション 1 がより一般的だと思います。

人気のある Web サーバー nginx を例にとると、複数のプロセス (スレッドではない) を作成して、ハンドルで着信イベントを処理し、サブプロセスでイベントを処理します。それらはすべて同じリッスン ソケットを共有します。オプション 1 と非常によく似ています。

于 2013-01-29T14:25:58.863 に答える
1

を使用してサーバーも書いていますepollが、添付したのと同じモデルを検討しました。

オプション 1 を使用することは可能ですが、「thundering herd」効果が発生する可能性があります。nginx のソースを読んで解決策を見つけることができます。オプション 2 については、毎回新しいスレッドを生成するのではなく、スレッド プールを使用する方がよいと思います。

また、次のモデルも使用できます:</p>

メイン スレッド/プロセス: acceptIO をブロックする着信接続。BlockingList を使用して fd を他のスレッドに送信するか、または を使用して他のプロセスに送信しPIPEます。

サブスレッド/プロセス: それぞれのインスタンスを作成しepoll、受信した fd を に追加してから、epollノンブロッキング IO で処理します。

于 2015-08-20T09:12:26.630 に答える
0

epoll はスレッドセーフです

次のコードがあなたの助けになることを願っています

https://github.com/jingchunzhang/56vfs/blob/master/network/vfs_so_r.c

于 2015-06-18T06:36:52.437 に答える
0

epoll はスレッド セーフです。適切な解決策は、ターゲット スレッドの epoll fd にあるファイル記述子レジスタを取得したら、メイン プロセスを accept(2) のままにすることです。つまり、スレッドごとに epoll キューがあることを意味します。スレッドを作成したら、呼び出し pthread_create(3) のパラメーターとして epoll ファイル記述子を共有するため、新しい接続が到着すると、ターゲットスレッドの epoll fd を使用して epoll_ctl(...EPOLL_CTL_ADD..) を実行しますaccept(2) 後に作成された新しいソケット、理にかなっていますか?

于 2013-02-14T19:19:10.400 に答える