【问题标题】:Calling FD_SET from other thread, select still blocking从其他线程调用 FD_SET,选择仍然阻塞
【发布时间】:2012-09-04 16:41:22
【问题描述】:

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

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,一切都会按预期工作。 但是从其他线程调用它什么都不做,select 一直等待,直到从客户端收到任何数据。

【问题讨论】:

    标签: c linux sockets select


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-11
      • 1970-01-01
      • 1970-01-01
      • 2016-03-27
      • 1970-01-01
      • 2014-04-03
      • 2017-07-18
      • 2012-11-08
      相关资源
      最近更新 更多