none
windows下的select RRS feed

  • 问题

  • 开发环境: vs2008

    操作系统 : winxp sp3

    问题描述: 在UDP编程中,我使用select做了个100ms的延迟,去等待一个套接口的数据; 程序运行时,select工作很正常, 100ms过后返回一个延迟,如果有数据, 读出来也正常. 问题发生在结束这个线程的时候. 我是这样做的:

    //server

    while (!stopServer) {

       int ret = select(....);

       if (ret < 0) break;

       else if (ret == 0) continue;

       else {

          process(...);

       }

    }

    // end the server

    void IF_stop()

    {

        shutdown(fd, SD_BOTH);

        stopServer = true;

        WaitForSingleObject(...);   /** 执行到这里程序卡死 */

        closesocket(fd);

    }

    奇怪的是, 我去掉 WaitForSingleObject,线程会正常退出。似乎,WaitForSingleObject不能知道线程已经返回了.恳请达人解惑,不胜感激。

    2013年8月7日 2:54

答案

  • // Server

    DWORD CALLBACK Thread_Server(LPVOID lpUser)

    {

       while (!stopServer) {

       int ret = select(....);

       if (ret < 0) break;

       else if (ret == 0) continue;

       else {

          process(...);

       }

    }

    }

    hServer = CreateThread(NULL, 1024, Thread_Server, 0, 0, 0);

    // 退出时

    stopServer = true;

    shutdown(fd, /** socket file desc */ SD_BOTH);

    WaitForSingleObjec(hServer);

    wait 的是 thread,根据你前面的描述 “我的客户端如果停止发送数据, 那么可以正常退出”,那是因为 thread 退出了,所以 wait 成功。

    你需要检查 Thread_Server 方法中是否能确保在设置了 stopServer = true 时,一定可以退出,select 有没有被阻塞?

    stopServer 最好申明为 volatile。

    2013年8月7日 8:04
  • 您好:

    我们建议您检查下hServer函数。因为WaitForSingleObject函数检查指定对象的当前状态。如果对象的无信号状态,调用线程进入等待状态,直到对象处于信号或时间超时间隔。


    Sunny Cao
    MSDN Community Support | Feedback to us
    Develop and promote your apps in Windows Store
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2013年8月7日 8:05
    版主

全部回复

  • WaitForSingleObject(...);    省略的调用参数很重要啊。也就是你要等待的这个句柄,并没有完成。
    2013年8月7日 3:00
  • WaitForSingleObject(hServer, INFINITE);

    可是我去掉一句,等待的这个线程就返回了。好像这个函数反而阻挡了那个server的执行,不明白啊 。。

    2013年8月7日 3:03
  • 有一点忘记说了,非常抱歉。

    我的客户端如果停止发送数据, 那么可以正常退出。

    2013年8月7日 3:14
  • WaitForSingleObject(hServer, INFINITE);

    可是我去掉一句,等待的这个线程就返回了。好像这个函数反而阻挡了那个server的执行,不明白啊 。。


    你这个 hServer 是怎么创建的,又是在哪里给设置了信号状态?
    2013年8月7日 3:23
  • // Server

    DWORD CALLBACK Thread_Server(LPVOID lpUser)

    {

       while (!stopServer) {

       int ret = select(....);

       if (ret < 0) break;

       else if (ret == 0) continue;

       else {

          process(...);

       }

    }

    }

    hServer = CreateThread(NULL, 1024, Thread_Server, 0, 0, 0);

    // 退出时

    stopServer = true;

    shutdown(fd, /** socket file desc */ SD_BOTH);

    WaitForSingleObjec(hServer);

    2013年8月7日 7:56
  • // Server

    DWORD CALLBACK Thread_Server(LPVOID lpUser)

    {

       while (!stopServer) {

       int ret = select(....);

       if (ret < 0) break;

       else if (ret == 0) continue;

       else {

          process(...);

       }

    }

    }

    hServer = CreateThread(NULL, 1024, Thread_Server, 0, 0, 0);

    // 退出时

    stopServer = true;

    shutdown(fd, /** socket file desc */ SD_BOTH);

    WaitForSingleObjec(hServer);

    wait 的是 thread,根据你前面的描述 “我的客户端如果停止发送数据, 那么可以正常退出”,那是因为 thread 退出了,所以 wait 成功。

    你需要检查 Thread_Server 方法中是否能确保在设置了 stopServer = true 时,一定可以退出,select 有没有被阻塞?

    stopServer 最好申明为 volatile。

    2013年8月7日 8:04
  • 您好:

    我们建议您检查下hServer函数。因为WaitForSingleObject函数检查指定对象的当前状态。如果对象的无信号状态,调用线程进入等待状态,直到对象处于信号或时间超时间隔。


    Sunny Cao
    MSDN Community Support | Feedback to us
    Develop and promote your apps in Windows Store
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2013年8月7日 8:05
    版主