我想唤醒2个线程,在2个select()中阻塞,使用相同的1个fd (使用R_ONLY),或者使用1个fd和这个fd (Fd)的副本
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 )
| test1 test2 | test1 test2 | test2 test1 | test1 test2 | test2 test1 ...但是看起来这些select()仍然是并发的,我目前的结果是:
| test1 | test2 | test2 | test1 | test1 | test1 | test....... 一次只有一个线程被唤醒...
我不期望线程之间有任何顺序:只是唤醒,做事情和阻塞。
我也不能控制或重新编码thread1 (不是我的),我只有一种方法可以得到想要的fd,我可以在上面同步thread2。
有没有办法做到这一点,否则我就卡住了?
谢谢
发布于 2014-10-18 22:04:32
dup系统调用以某种方式复制文件描述符,以便fd1和fd2仍然引用进程文件描述符表中的相同条目。
虽然在这种情况下,select的行为可能依赖于实现,但可以合理地认为,您不能用同一文件描述符上的事件来唤醒两个线程,或者即使可能,也只能有一个线程能够使用可用的数据。
https://stackoverflow.com/questions/26409940
复制相似问题