如何让一个阻塞在recv()上的线程优雅地退出?

Nan*_*iao 8 c unix sockets multithreading

有一个线程喜欢这个:

{  
    ......    
    while (1)
    {
        recv(socket, buffer, sizeof(buffer), 0);
        ......
    }
    close(socket);           
}  
Run Code Online (Sandbox Code Playgroud)

因为线程在recv()调用时阻塞,我怎么能让线程正常退出?

Rah*_*thi 5

你可以打电话: -

shutdown(sock, SHUT_RDWR)    //on the remote end
Run Code Online (Sandbox Code Playgroud)

看看这个.


Sas*_*wot 5

不要阻止recv.而是在'select'上实现一个块并测试输入fdset以确定是否有任何东西要读取.

如果有要读取的数据,请调用recv.如果没有,请循环,检查'isrunning'volitile布尔变量,该变量在启动关闭时由另一个线程设置.

  • 实际上它非常高.它允许您为每个线程同时服务多个套接字.我在托管数千个连接的服务器上使用了这种方法.通过每个线程选择来管理64个套接字的块.即使在完全吞吐量的情况下,CPU负载仍然低于百分之十. (2认同)