我创建了3个线程,每个线程各有一个套接字。 在每个线程内部,套接字被设置为“事件驱动”,并且只要数据可用于读取,就会生成一个事件。
代码工作正常,但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;
}
答案 0 :(得分:3)
这是一个错误:
waitRet = WSAWaitForMultipleEvents(2, &hEvent, FALSE, WSA_INFINITE, FALSE);
因为它声明在提供的事件数组中有两个事件,因为只有1,所以不是这种情况。来自描述第一个参数的WSAWaitForMultipleEvents()
参考页面:
lphEvents指向的数组中的事件对象句柄数。 WSA_MAXIMUM_WAIT_EVENTS的最大事件对象句柄数。必须指定一个或多个事件。
我怀疑导致未定义的行为WSAWaitForMultipleEvents()
正在访问超出数组范围的行为,可能导致函数不阻塞导致忙循环。
此外,请参阅Rohan关于WSAResetEvent()
的使用情况的回答。