CPU使用率100%创build3个线程并使用WSAWaitForMultipleEvents()和WSAEnumNetworkEvents()

我创build了3个线程,每个线程都有一个套接字。 在每个线程内部,套接字被设置为“Event Driven”,并且只要数据可用于读取,就会生成一个事件

代码工作正常,但它占用CPU使用率高达100%,这肯定是不可取的。 我想我犯了一些错误。 以下是我的代码。 请帮我弄清楚我在100%的CPU使用率方面犯了什么错误。

码:

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

这是一个错误:

 waitRet = WSAWaitForMultipleEvents(2, &hEvent, FALSE, WSA_INFINITE, FALSE); 

因为它表明在提供的事件数组中有两个事件,事实并非如此,因为只有1个事件。从描述第一个参数的WSAWaitForMultipleEvents()参考页面:

由lphEvents指向的数组中的事件对象句柄的数量。 事件对象句柄的最大数目是WSA_MAXIMUM_WAIT_EVENTS。 必须指定一个或多个事件。

我怀疑这导致未定义的行为,因为WSAWaitForMultipleEvents()正在访问超出数组的边界,可能导致函数不阻塞导致繁忙的循环。

此外,请参阅Rohan关于WSAResetEvent()使用的WSAResetEvent()