- ベストアンサー
WinSockにおけるポーリングの是非について。
Winsockにおいて、socketをノンブロッキングでコーディングするときの話なのですが、ポーリングに関して否定的な記事が見受けられますが、その理由がCPU負荷の問題や、メッセージのディスパッチの問題が理由としてあげられています。 しかしこれは、正しく解決すれば何ら問題にならないと思うのですが、何か他に理由でもあるのでしょううか。 もちろん『なぜイベントでだめなのか?』と言われるかもしれませんが、逆に、『なぜポーリングじゃだめなのか?』と問いたいのです。 それとも、『入門記事だから初心者はこんな危険なことをするな!』という戒めなのでしょうか。 ※もちろん、ポーリングもひとつの方法として記述されている記事も多数あります。 以上、よろしくおねがいします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
Sleep(0)やSleep(1)だと結構CPU負荷が上がりませんか。「問題ない」レベルの設定にもよりますけど。 MsgWaitForMultipleObjectsは複数イベント待ちでselectと同等です。これを正しく使えばポーリングは必要ないと思います。 まあハンドルを取得するのが面倒なので代わりにポーリングという実装もありますけど。 私もポーリングは絶対ダメとは言いませんよ。実装方式はプログラムの目的とかメンテナンス性も勘案して決めることです。
その他の回答 (2)
- aris-wiz
- ベストアンサー率38% (96/252)
>Sleep(0)もしくはSleep(1)もしくは、 >MsgWaitForMultipleObjects等で全然問題ない ポーリングの方法は環境によってはいくつも存在しますし、 それで誰が何を持って「問題ない」と言い切れるのか、 というところでしょうね。 #selectは仕様上ある程度使い方が決まってきますし。 私の場合は、別にどっちが悪いとかではなくて、 単純にどちらがその機能を作るのに適しているかで 使い分けるものだと思ってますが。。。
お礼
回答ありがとうございます。 『問題ない』とは、CPU負荷の問題や、メッセージのディスパッチの問題に対して『問題ない』と記述したまでです。
- rinkun
- ベストアンサー率44% (706/1571)
一般的には問題を正しく解決するのが難しいからでは? ポーリングしつつCPU負荷を高くしないならポーリングと待ちの繰り返しになるだろうけど、それならselectをタイムアウト付きで使う方が応用が利くし効率も良いのでは?
お礼
回答ありがとうございます。もちろんその通りなんです。 ただし、そんなに難しい話ではなく、Sleep(0)もしくはSleep(1)もしくは、MsgWaitForMultipleObjects等で全然問題ない気がするのです^^;
お礼
ありがとうございました。 Sleep(0)に関しては、CPU負荷があがりますが、ヂィスパッチの問題はありません。Sleep(1)は、CPU負荷自体があがりません。