[英]Linux 3.5: Safe to `read(2)` from same fd `open(2)` `/dev/urandom` from multiple threads?
[英]`select` on same fd from multiple threads
如果我叫会发生什么情况select
从多个线程相同的开放文件描述符?
这是在某处记录的吗?
根据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
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.