如果我从多个线程调用同一个已打开的文件描述符上的 select
,会发生什么?
这个问题有没有文档可以参考?
如果我从多个线程调用同一个已打开的文件描述符上的 select
,会发生什么?
这个问题有没有文档可以参考?
select
规范,没有禁止两个线程同时调用select
的限制。select
是一个线程安全的函数和一个取消点。select
,而其他线程将被阻塞(select
的主体部分是一个关键区域)。无论哪些描述符被返回给第一个线程,然后成功进入select
的第二个线程可能会立即使用相同的集合唤醒,因为select
是一个水平触发接口。select
同时选择多组文件描述符。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;
}
select
函数。select
手册页面,我没有看到任何证明两个不同线程在不同(甚至相同)的fd_sets上进行选择会相互阻塞的东西。可能在Linux实现中有一些限制,但我没有看到POSIX标准中有任何建议的东西。 - Jonathan Lefflerstrtok()
函数是一个非线程安全函数的例子;两个线程同时使用它是不安全的。实际上,strtok()
的问题更严重;即使是单线程程序也不能同时使用两组使用 strtok()
进行分析。其他非线程安全函数包括像 ctime()
这样的珠宝;它返回指向可能在后续调用中被重用的数据区的指针。 - Jonathan Lefflerselect
似乎是完全可重入的,所以要么自从上次我尝试后Linux在这方面发生了变化,要么我把它和另一个操作系统混淆了。 - jxh
select
操作。 - obatakuselect
以提高可读性,在另一个线程中使用select
以提高可写性是否安全? - Remy Lebeau