问题描述
我创建了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;
}
推荐答案
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%的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!