`select`来自多个线程的同一个fd

如果我从多个线程调用相同的打开文件描述符,会发生什么?

这是在某处记录的吗?

根据POSIX 2008 select规范,没有任何东西禁止两个线程同时调用select

可以合理地推断,如果两个线程都监视重叠的文件描述符集并且一些公共文件描述符变得可读或可写或者诊断出错误,则两个线程可能最终得到公共文件描述符准备好的报告。 这不能保证; 有时间问题需要担心,它可能取决于线程的调度等。这也意味着其中一个线程可能最终没有找到数据来读取文件描述符,它被告知包含要读取的数据,正是因为另一个线程首先到达那里。 任何给定的数据字节将只由其中一个线程读取。

根据Linux手册页 , select是一个线程安全函数和一个取消点。

Linux上的某些操作系统中,一个线程将成功进入select ,而其他线程将被阻塞( select的主体是一个关键部分)。 无论返回到第一个线程的描述符是什么,然后成功进入select的第二个线程可能会立即使用相同的集合唤醒,因为select是一个级别触发的接口。

因此,您无法在Linux上同时使用select来选择多组文件描述符。

Linux似乎支持完全重入执行,使用此测试程序演示:

 void * reader (void *arg) { int *fds = (int *)arg; struct timeval to = { 2, 0 }; fd_set rfds; FD_ZERO(&rfds); FD_SET(fds[0], &rfds); select(fds[0]+1, &rfds, 0, 0, &to); } int main () { int sp[2]; pthread_t t[2]; socketpair(AF_UNIX, SOCK_STREAM, 0, sp); pthread_create(&t[0], 0, reader, sp); pthread_create(&t[1], 0, reader, sp); pthread_join(t[0], 0); pthread_join(t[1], 0); return 0; } 

当在Linux上计时这个程序(我的是2.6.43)时,程序在2秒后返回,表明两个线程同时进入select