2

各スレッドにはそれぞれ1つのソケットがある3つのスレッドを作成しました。各スレッド内で、ソケットは「イベント ドリブン」になり、データが読み取り可能になるたびにイベントが生成されます。

コードは正常に動作しますが、CPU 使用率が最大 100% になり、これは確かに望ましくありません。私はいくつかの間違いを犯したと思います。以下は私のコードです。CPU 使用率が 100% になるような間違いを犯した原因を突き止めるのを手伝ってください。

コード:

DWORD WINAPI ThreadProc(LPVOID param)
{
   int threadNumber= (int)param;
   int PORT = 8888+threadNumber; //so that each thread bind()s its socket to a different Port number.
   WSADATA wsa; 

   //Initialise winsock//
   if (WSAStartup(MAKEWORD(2,2),&wsa) != 0)
      {

        //"WinSock Initialization FAILED",

      }

   //Create a socket//

  SOCKET newSocketIdentifier;
  SOCKADDR_IN newSocket;

  if((newSocketIdentifier = socket(AF_INET , SOCK_DGRAM , 0 )) == INVALID_SOCKET)
      {                 

        //Socket Creation Failed

      }
   //Socket Created//

   //Prepare the sockaddr_in structure//
  newSocket.sin_family = AF_INET;
  newSocket.sin_addr.s_addr = INADDR_ANY;
  newSocket.sin_port = htons(PORT);

   //Bind//
   if( bind(newSocketIdentifier ,(struct sockaddr *)&newSocket, sizeof(SOCKADDR_IN)) == SOCKET_ERROR)
      { 
       //Bind Failed
      }

   //Bind Done//
char data[256];
int bytes, waitRet;

WSAEVENT hEvent = WSACreateEvent();
WSANETWORKEVENTS events;
WSAEventSelect(newSocketIdentifier, hEvent, FD_READ | FD_WRITE);

   while(1)
      {
         waitRet = WSAWaitForMultipleEvents(2, &hEvent, FALSE, WSA_INFINITE, FALSE);
         if(WSAEnumNetworkEvents(newSocketIdentifier,hEvent,&events) == SOCKET_ERROR)
            //Error
         else
            {
               if(events.lNetworkEvents & FD_READ)
                  {
                      //call recvfrom()
                  }
            }
      }

    WSACloseEvent(hEvent);
   return 0;
}

int WINAPI WinMain( HINSTANCE hInst, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )
{

   HANDLE threadHandle[3];
   DWORD threadId = 0;
   int max_number=3;
   //Start the threads
   for (int i = 0; i < max_number; i++) 
   {
    threadHandle[i]= CreateThread( NULL,
                                       0,
                                       ThreadProc,
                                       (LPVOID) i,
                                       0,
                                       NULL
                                 );
   }

return 0;
}
4

1 に答える 1