私は現在、最大の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.多くのカーネル呼び出し。睡眠は最初の問題を解決します(私が望む)が、私は非ブロッキングソケットモードでの受信の呼び出しパフォーマンスについて何も知らないし、なぜそれらの呼び出しの多くがこれを悪い解決策にしているのか。