Socket の Thundering Hird

ただ、私の記憶が正しければ、1プロセスしか accept に成功しないにもかかわらず全プロセスがwakeされる (=全ての accept がなんらかの結果 (ほとんどの場合 EAGAIN) を返す) というのが、Thundering Herd の最大の問題だったはずです

Kazuho@Cybozu Labs: キャッシュシステムの Thundering Herd 問題

ぶっちゃけ BSD Socket の設計だとそれが自然の実装なんよね。なんでも select(2) 可能にしちゃう select(2) 脳ゆえの問題とでも言うべきか (デメリットを上回るメリットがあるけど)。結局最近のOSにおいて accept(2) が Thundering Herd 問題を起こさないというのは、カーネルサイドで accept(2) の呼び出すについて特別扱いをしてごまかしているだけの話。だから、

fcntl(listenfd, FD_SET, O_NONBLOCK); // see man for the necessity of this line
...
select(...);
if (FD_ISSET(listen_fd, &read_fds)) {
  s = accept(listen_fd, ...);

みたいなコードは今でも Thundering Herd する (はず)。