Linuxでは、プロセスのファイルディスクリプタテーブル(fdtable)は最低256スロットから始まるんだ。2つのスレッドがそれぞれ256ソケットを作ると、合計で512のfdを使うことになるから、標準入力、標準出力、標準エラーの3つに加えて、256から512に容量が倍増する際にfdtableを半分くらい拡張する必要があるんだ。そして、512から1024にリサイズする際にもまた拡張が必要になる。これはカーネル内のexpand_fdtable()によって行われるよ。以下のコードが含まれてる:if (atomic_read(&files->count) > 1) synchronize_rcu(); files->countは参照カウンタなんだ。2つのスレッドがオープンファイルのセットを共有しているから、この値は2になる。つまり、fdtableの拡張中にsynchronize_rcu()が呼ばれるってこと。これによって、現在作成中のソケットのために新しいfdを取得するのが遅れるんだ。もし新しいスレッドを作成する前にfdtableを拡張すると、テストプログラムがコマンドライン引数を与えられた場合にdup(0, 666)を呼び出すことでこれを避けられる。そうすると、files->count == 1になるからsynchronize_rcu()の呼び出しがなくなるんだ。だから、これをやれば、fdtableが十分な容量を持っているから、すべてのソケットを作成する際に遅れがなくなるよ。一方で、OpenBSDのカーネルにはRCUのようなものはなくて、プロセスのファイルディスクリプタテーブルが変更されるときにrwlockを使うだけだから、Linuxで見られるような拡張時の長い遅延を避けられるんだ。