0

我在使用单选调用编写我的第一个异步服务器时遇到了这个问题:

if( (retv = select((hsock<highestsocket?highestsocket:hsock)+1, &rFdx, &wFdx, &eFdx, 0) ) > 0)
{
   printf("select() ended...\n");
    if(FD_ISSET(hsock, &rFdx))
    {
      // .... handle new connection
    }

    for(unsigned int i=0; i < ClientList.size(); i++)
    {
      ServerClient* client = ClientList[i];

      if(FD_ISSET(client->socket, &rFdx))
      {
        // handle client read
      }
      if(FD_ISSET(client->socket, &wFdx))
      {
           // handle client write
      }    

    }
}

我希望在从其他线程调用 FD_SET 时选择停止等待然后处理客户端写入。

如果我从同一个线程调用客户端套接字上的 FD_SET,一切都会按预期工作。但是从其他线程调用它什么都不做,选择会一直等待,直到从客户端接收到任何数据。

4

1 回答 1

2

当然,您不能在一个线程中修改数据并期望在没有适当同步的情况下该修改在其他线程中可见。很可能在被调用时立即select读取fd_set它,然后再也不看它;select但无论如何,如果已经被调用,则无法获得必要的同步。你真的需要重新考虑你的设计。一种解决方案是“自管道”技巧:打开一个select始终在寻找输入的管道,并让您的其他线程通过管道发送消息以取消任何挂起select并让select线程重新扫描文件描述符表它应该正在查看(使用适当的同步!)并更新自己fd_set的 s。

于 2012-09-04T17:50:27.440 回答