gpt4 book ai didi

从其他线程调用 FD_SET,select 仍然阻塞

转载 作者:太空宇宙 更新时间:2023-11-04 09:49:51 24 4
gpt4 key购买 nike

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

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 一直等待直到从客户端接收到任何数据。

最佳答案

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

关于从其他线程调用 FD_SET,select 仍然阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12267877/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com