Reputation: 2754
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];
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;
}
Upvotes: 2
Views: 499
Reputation: 121971
This is an error:
waitRet = WSAWaitForMultipleEvents(2, &hEvent, FALSE, WSA_INFINITE, FALSE);
as it is stating there are two events in the supplied event array, which is not the case as there is only 1. From the WSAWaitForMultipleEvents()
reference page describing the first argument:
The number of event object handles in the array pointed to by lphEvents. The maximum number of event object handles is WSA_MAXIMUM_WAIT_EVENTS. One or more events must be specified.
I suspect that this causing undefined behaviour as WSAWaitForMultipleEvents()
is accessing beyond the bounds of the array, probably causing the function to not block resulting in the busy loop.
Additionally, see answer from Rohan regarding usage of WSAResetEvent()
.
Upvotes: 3