1

假设我有一个从多个进程或线程多次打开的 fifo(命名管道)。他们都将调用 select() 进行并发读取。如果一个作家进来并写入,比如说一个字节到这个fifo,所有阻塞的select()调用会同时返回还是只选择一个线程并从select()返回?

对此是否有任何规范,或者这是否取决于系统?

我问的原因是我想使用 fifos 实现类似 Windows 的手动重置事件。手动重置事件要求当事件发出信号时,所有等待的线程都将被释放(而不是自动重置事件只有一个)。

我可以为此使用 pthread conds,但我的要求是多个进程共享事件。

谢谢。

4

1 回答 1

1

如果一个作家进来并写入,比如说一个字节到这个fifo,所有阻塞的select()调用会同时返回还是只选择一个线程并从select()返回?

会有一个比赛条件。系统将开始以某种随机顺序唤醒线程,直到其中一个读取数据,清空缓冲区并阻止其他线程唤醒。

对此是否有任何规范,或者这是否取决于系统?

这将取决于系统、应用程序布局、代码结构。这将是一种很棒的未定义行为。

我问的原因是我想使用 fifos 实现类似 Windows 的手动重置事件。

你在 Linux/Posix 上编码吗?使用 tee 函数而不是 read,使线程将一些状态代码写回管道以表示它们已唤醒。然后,通过在控制线程中读回数据来重置管道。

即,执行以下操作:

在工作线程中:选择(和阻止)。在控制线程中:写入一个字节。现在选择没有阻塞。工作线程被唤醒。现在在工作线程中做一个可选的 tee(一个字节)并将一个字节写回每个线程中的管道。在控制线程中:读取和计数字节。如果所有工作线程波都唤醒,请再读取一个字节以擦除您写入的第一个字节。现在选择再次阻塞。

请注意,在完成整个过程之前,您不能再次输入选择。您可能需要两个这样的管道。

于 2013-09-10T12:27:14.233 回答