首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用带有1个文件描述符的2个select()或使用dup(fd)

使用带有1个文件描述符的2个select()或使用dup(fd)
EN

Stack Overflow用户
提问于 2014-10-17 00:59:36
回答 1查看 70关注 0票数 0

我想唤醒2个线程,在2个select()中阻塞,使用相同的1个fd (使用R_ONLY),或者使用1个fd和这个fd (Fd)的副本

代码语言:javascript
复制
int fd1(R_Only);
int fd2 = dup(fd1);

//Thread1
result = select(fd1);
if (result)
   printf("test1");

//Thread2
result = select(fd2);
if (result)
   printf("test2");

我期望的结果是,每次准备好读取管道时,我都会得到如下内容:(|( fd1 )表示准备读取的fd1 )

代码语言:javascript
复制
| test1 test2 | test1 test2 | test2 test1 | test1 test2 | test2 test1 ...

但是看起来这些select()仍然是并发的,我目前的结果是:

代码语言:javascript
复制
| test1 | test2 | test2 | test1 | test1 | test1 | test.......  

一次只有一个线程被唤醒...

我不期望线程之间有任何顺序:只是唤醒,做事情和阻塞。

我也不能控制或重新编码thread1 (不是我的),我只有一种方法可以得到想要的fd,我可以在上面同步thread2。

有没有办法做到这一点,否则我就卡住了?

谢谢

EN

回答 1

Stack Overflow用户

发布于 2014-10-18 22:04:32

dup系统调用以某种方式复制文件描述符,以便fd1fd2仍然引用进程文件描述符表中的相同条目。

虽然在这种情况下,select的行为可能依赖于实现,但可以合理地认为,您不能用同一文件描述符上的事件来唤醒两个线程,或者即使可能,也只能有一个线程能够使用可用的数据。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26409940

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档