これは、この回答に関する質問です: https://stackoverflow.com/a/14241095/2332808 (コメントしますが、新しく作成されたアカウントは明らかにコメントできません。ノイズで申し訳ありません。epollet/multithreading のリソースを見つけるのは困難です.. .)
次のように epoll を使用することをお勧めします。
epoll_ctl()
通知をアクティブ化します (EPOLLONESHOT
使用されている場合は再アクティブ化します)。- システム入力:
read()
//エラーが発生するまでループしrecv()
ます。accept()
EAGAIN
epoll_wait()
通知を受け取る。
epoll_wait()
しかし、同じ epollfd に複数のスレッドがあると仮定すると、読み取りが完了する前にさらにデータを受信した場合、同じ fd で別のスレッドが起動されるリスクはありません (たとえば、2 つのスレッドが同じ fd を処理することになります)。 )
物事を好転させてread()
まで戻しEAGAIN
、もう一度epoll_ctl()
呼び出しread()
てまだ何もないことを確認しても (最後の読み取りと の間に何かを受け取る競合を避けるためepoll_ctl()
)...
しかしepoll_ctl()
、あなたが実際に何かを受け取っていないという保証はまだありませんread()
.
fdごとにロックを設定することは許容できる解決策だと思いますが、複数のスレッドが同じ epollfd でポーリングするエッジトリガーモードでの epoll の「承認された」使用ですか?