マルチスレッドの epoll サーバーを使用しています。epoll fd を作成すると、X スレッドがスリープ状態になり、その同じ epoll fd からのイベントを待機しepoll_wait()
ます。
ここで私の質問は次のとおりです。N > 1 && N < X で、N 個のスレッドをウェイクアップするにはどうすればよいですか?
これまで、Linux 固有の eventfd 機能を使用してきました。これは 1 つのスレッドだけでかなりうまく機能しましたが、複数のスレッドが同じ epoll fd を待機していると、問題が発生します。
ケース 1) LT: 「レベル トリガー」モードで eventfd を追加すると、eventfdへの書き込み時にすべてのスレッドが起動します。これは、レベル トリガー モードがどのように機能するかです。
N = X
ケース 2) ET: 「エッジ トリガー」モードで eventfd を追加すると、eventfdに書き込むときに1 つのスレッドのみが起動します。これがエッジ トリガー モードのしくみEAGAIN
ですread(eventfd, ...);
。
N = 1
ケース 3) セルフパイプ トリックも試しましたが、パイプに N 回書き込むと N スレッドが起動します。信頼性が低く、1 つのスレッドがパイプから 2 つの「トークン」を読み取ることもあれば、1 つまたは 3 つ読み取ることもあります。
N = ランダム
私が試したすべてのケースで、N=N だけを取得することはできません。N スレッドのみを起動することはできませんが、1、ALL、または RANDOM のいずれかです。私は何が欠けていますか?何かご意見は?EFD_SEMAPHORE
注:そこからの助けなしに、eventfd固有のフラグも試しました。