线程查询 SDL_Net

Thread query SDL_Net

运行 我在单独线程中的监听函数似乎用掉了很多 CPU 使用延迟来减少 cpu 使用是否被认为是可以的,还是我使用线程完全错误?

// Running in a seperate Thread
void Server::listen()
{ 
    while (m_running)
    {
        if (SDLNet_UDP_Recv(m_socket, m_packet) > 0)
        {
              //Handle Packet Function
        }
    }
}

来自the SDLNet_UDP_Recv reference

This is a non-blocking call, meaning if there's no data ready to be received the function will return.

这意味着如果没有接收到任何东西,那么 SDLNet_UDP_Recv 将 return 立即与 0 并且你的循环将迭代并再次调用 SDLNet_UDP_Recv return s 0 等等。这个循环永远不会暂停,所以它当然会尽可能多地使用 CPU。

一个可能的解决方案确实是在循环中添加某种延迟或休眠。

我会建议类似

while (m_running)
{
    int res;
    while (m_running && (res = SDLNet_UDP_Recv(...)) > 0)
    {
        // Handle message
    }

    if (res < 0)
    {
        // Handle error
    }
    else if (m_running /* && res == 0 */)
    {
        // Small delay or sleep
    }
}