创建3个线程并使用WSAWaitForMultipleEvents()和WSAEnumNetworkEvents()时,CPU使用率为100% [英] CPU Usage 100% when creating 3 threads and using WSAWaitForMultipleEvents() and WSAEnumNetworkEvents()

查看:113
本文介绍了创建3个线程并使用WSAWaitForMultipleEvents()和WSAEnumNetworkEvents()时,CPU使用率为100%的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我创建了3个线程,每个线程各有一个套接字。在每个线程内部,套接字被设置为事件驱动,并且每当数据可用于读取时,就会生成一个事件。



代码工作正常,但需要CPU使用率100%肯定是不受欢迎的。我想我犯了一些错误。以下是我的代码。请帮我弄清楚我犯了什么错误导致100%的CPU使用率。



代码:



I have created 3 threads each thread has one socket each. Inside each thread, socket is made "Event Driven" and whenever data becomes available for reading, an event is generated.

The code works fine but it takes CPU Usage upto 100% which is surely undesirable. I think I have made some mistake. Below is my code. Please help me in figuring out what mistake have I made that results in 100% CPU Usage.

Code:

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];
   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;
}

推荐答案

我猜你的线程正在阻止网络api。



为什么你没有做出一些出局或使用你的调试器...
i guess your threads are blocking the network api.

why arent you making some outout or use your debugger...


当函数调用失败时,你是否报告错误并终止线程?



至少有一个错误的调用会导致错误返回(最佳情况)或未定义的行为(最坏的情况):

Did you report errors and terminate the thread when a function call fails?

There is at least one wrong call that should result in an error return (best case) or undefined behaviour (worst case):
WSAWaitForMultipleEvents(2, &hEvent, FALSE, WSA_INFINITE, FALSE);



您正在传递 2 了解事件数量和单个 hEvent 的地址。

所以必须是其中一个:


You are passing 2 for the number of events and the address of a single hEvent.
So it must be one of these:

// Single event
WSAWaitForMultipleEvents(1, &hEvent, FALSE, WSA_INFINITE, FALSE);

// Two events
WSAEVENT hEvents[2];
hEvents[0] = hEvent;
hEvents[1] = hOtherEvent;
WSAWaitForMultipleEvents(2, hEvents, FALSE, WSA_INFINITE, FALSE);


这篇关于创建3个线程并使用WSAWaitForMultipleEvents()和WSAEnumNetworkEvents()时,CPU使用率为100%的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆