C++ FD_设置导致seg故障

C++ FD_设置导致seg故障,c++,multithreading,boost,segmentation-fault,file-descriptor,C++,Multithreading,Boost,Segmentation Fault,File Descriptor,我遇到了一个问题,FD\u SET正在使我的程序崩溃。我正在运行来自boost的示例代码。在请求处理程序中,我放置了一个第三方api,该api最终进行以下调用: fd_set fds; FD_ZERO(&fds); FD_SET(sockfd, &fds); 我的程序似乎在FD\u集上崩溃。是否存在从不同线程调用FD_SET会导致segfault的情况?我不确定FD_集到底是如何工作的,我的直觉是我正在使用的FD上调用FD_集。这会不会造成问题 sockfd是一个类成员,每次

我遇到了一个问题,
FD\u SET
正在使我的程序崩溃。我正在运行来自boost的示例代码。在请求处理程序中,我放置了一个第三方api,该api最终进行以下调用:

fd_set fds; 
FD_ZERO(&fds);
FD_SET(sockfd, &fds);
我的程序似乎在
FD\u集
上崩溃。是否存在从不同线程调用
FD_SET
会导致segfault的情况?我不确定
FD_集
到底是如何工作的,我的直觉是我正在使用的FD上调用
FD_集
。这会不会造成问题


sockfd
是一个类成员,每次请求传入时都会创建它,因此我不应该在线程之间共享
sockfd
变量。

在每秒1000个请求时,您很可能会超过
FD\u SETSIZE
限制(在Linux上通常是1024个),这会导致:

fd_集是一个固定大小的缓冲区。使用 fd的负值或等于或大于 FD_SETSIZE将导致未定义的行为。此外,POSIX需要 fd必须是有效的文件描述符


您应该考虑使用或更高级别的库,如。这些选择中的任何一个都没有
select

的限制,在每秒1000个请求时,您很可能会超过
FD_SETSIZE
限制(在Linux上通常是1024个),这会导致:

fd_集是一个固定大小的缓冲区。使用 fd的负值或等于或大于 FD_SETSIZE将导致未定义的行为。此外,POSIX需要 fd必须是有效的文件描述符


您应该考虑使用或更高级别的库,如。这些选择中的任何一个都不受
select

的限制,您所说的“看起来像”是什么意思?你不能使用调试器来确定吗?你检查过
sockfd
是正数,并且小于
FD_SETSIZE
FD_SET()
实际上只是在无符号整数数组中设置了一位。使用上述代码,
FD_SET
失败或弄糟事情的最可能原因是
sockfd
超出范围,例如。,因为它无效,或者因为可用套接字的系统参数大于
fd_set
中的可用位。问题是增加系统上可用文件描述符的数量不会改变实现这些类的C库。理想情况下,您应该将代码更改为与相对低效的
select()
不同的代码,以使用
poll()
epoll()
。您的问题是,一旦超过
FD_SETSIZE
,正在设置的位就在不相关的内存中的某个地方,这只是缓冲区溢出的一种形式。@Eumcoz:您可以使用
poll
epoll
,或者通过Boost库在更高级别上工作。我不知道是否有任何方法可以增加
FD_SETSIZE
,因为我自己不必为
选择而烦恼。你说的“看起来像”是什么意思?你不能使用调试器来确定吗?你检查过
sockfd
是正数,并且小于
FD_SETSIZE
FD_SET()
实际上只是在无符号整数数组中设置了一位。使用上述代码,
FD_SET
失败或弄糟事情的最可能原因是
sockfd
超出范围,例如。,因为它无效,或者因为可用套接字的系统参数大于
fd_set
中的可用位。问题是增加系统上可用文件描述符的数量不会改变实现这些类的C库。理想情况下,您应该将代码更改为与相对低效的
select()
不同的代码,以使用
poll()
epoll()
。您的问题是,一旦超过
FD_SETSIZE
,正在设置的位就在不相关的内存中的某个地方,这只是缓冲区溢出的一种形式。@Eumcoz:您可以使用
poll
epoll
,或者通过Boost库在更高级别上工作。我不知道是否有任何方法可以增加
FD_SETSIZE
,因为我自己不必为
选择而烦恼。