2017-04-15 12 views
-1

私は現在、最大のwinsock2を使用してサーバーをプログラミングしています。ワークロードは約1000の同時接続になります。ソケットを受け入れるために、私はブロックモードでaccept()を実行する分離スレッドを使用しています。しかし、この疑似ように私は(も区切らスレッドを持つ)について考えてデータを受信するが、今回は非ブロックモードとコードを使用する:ブロックされていないソケットのrecvループがきつくありません。

for (;;) 
{ 
    foreach socket 
    { 
     int num = socket.recv(..); 

     if (num == SOCKET_ERROR && WSAGetLastError() == EAGAIN/EWOULDBLOCK) 
      continue; 
     else 
      // push buffer to worker thread/handle error 
    } 
    thread.sleep(1); 
} 

なり、CPUに苦労を与えることなく、この作品? なぜこのコードが悪いのかについてインターネットで見つかった主な理由は2つあります。1. cpu load 2.多くのカーネル呼び出し。睡眠は最初の問題を解決します(私が望む)が、私は非ブロッキングソケットモードでの受信の呼び出しパフォーマンスについて何も知らないし、なぜそれらの呼び出しの多くがこれを悪い解決策にしているのか。

答えて

0

いいえ、CPUに苦労することなく動作しません。あなたが正確に正しい時間をブロックすることができるとき、睡眠は文字通り時間の無駄です。

これを行わないでください。私はなぜあなたが最初の場所でそれについて考えるのか想像できません。

関連する問題