基礎的なところで相談させてください。
長文ですいません。

今勉強として、Winsockでチャットサーバーを作っています。

最初はWSAAsyncSelectを使い、WMで接続を受け付けたり、送られてきたデータを読んだりしていました。
・FD_READでデータを読み込み、バッファに貯める。バッファに発言内容が1つ以上貯まっていたら、それらを全ユーザーに送信し、不必要になった部分をバッファから削除する
といった感じで、うまく動いています。


その次に、以下の機能を追加しました。
「1ユーザーは5秒に1度以上は発言できず、それより短い間隔で発言がサーバーに届いた場合、遅延させて全ユーザーに届ける」
というものです。
「あ」「い」という2つの発言が1秒で届いたとしても、まずは「あ」だけ送り、「い」は5秒後に送る。という仕様です。
(何だその仕様。と思うかもしれませんが、「ユーザーの動作にたいし、遅延させてから情報を送る」実験のための仕様なので)

再現するために、WM_TIMERを1秒ごとにまわし、発言が「貯まっている」ユーザーを探して、貯まっていてかつ前回発言より5秒経っていたら送信するようにしてみました。

ここで気づいたのですが、このような「サーバーが一定時間毎に色々監視する」場合
わざわざWSAAsyncを使わずに、ノンブロッキングモードにして
acceptも各ユーザーのreadも1つのスレッドで回したほうが実装が楽そうだと思いました。

しかしながら
ttp://www.kt.rim.or.jp/~ksk/wskfaq-ja/
などでは「ポーリングは絶対するな」という風に書かれており、ノンブロッキングモードは非推奨のようです。

ではと、FD_ACCEPTやFD_READを使うとともに、別スレッドでユーザーたちを監視するような形にすると、今度はスレッド間の排他処理で実装が少し複雑になります。

「定期的に●●する」ようなサーバーを立てる場合、どんな方式でやるのが望ましいのでしょうか?