小松です。

mswin32でたとえばsleep 10を実行するとCPUが100%になってしまいます。

C:\lang\ruby>ruby -ve 'sleep 10'
ruby 1.5.0 (1999-12-14) [i386-mswin32]
    ← 実行中のCPUが100%になる
C:\lang\ruby>

これは、以下のようにselect()でsleep()の代替ができないための
ようです。

C:\lang\ruby>type t.c
#include <winsock.h>

int main()
{
    struct timeval timeout;
    timeout.tv_sec = 10;
    timeout.tv_usec = 0;
    select(0, 0, 0, 0, &timeout);
    return 0;
}

C:\lang\ruby>cl -nologo t.c ws2_32.lib
t.c

C:\lang\ruby>t
    ← 10秒待たずに一瞬で終わってしまう。
C:\lang\ruby>

ということで、(nfds == 0 && timeout) の場合はSleep()を使用するように
してみました。

--- win32/win32.c.dist Mon Nov 8 12:57:01 1999 +++ win32/win32.c Thu Dec 23 14:58:31 1999 @@ -1803,4 +1803,8 @@ myselect (int nfds, fd_set *rd, fd_set * StartSockets(); } + if (nfds == 0 && timeout) { + Sleep(timeout->tv_sec * 1000 + timeout->tv_usec / 1000); + return 0; + } if ((r = select (nfds, rd, wr, ex, timeout)) == SOCKET_ERROR) { errno = WSAGetLastError(); -- 小松克行 / Katsuyuki Komatsu <komatsu / sarion.co.jp>