使用2 select()与1文件描述符或使用dup(fd)

时间:2014-10-16 16:59:36

标签: multithreading select concurrency

我想唤醒2个线程,阻塞在2个select()中,使用相同的1 fd(使用R_ONLY) 或使用1 fd和此fd dup(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(不是我的),我只是想办法找回我可以同步thread2的所需fd。

有办法做到这一点还是我被卡住了?

感谢

1 个答案:

答案 0 :(得分:0)

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

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