0

我在 pselect 的手册页中看到了以下段落。

需要 pselect() 的原因是,如果要等待信号或文件描述符准备就绪,则需要进行原子测试以防止竞争条件。(假设信号处理程序设置了一个全局标志并返回。然后,如果信号在测试之后但在调用之前到达,则对该全局标志的测试随后调用 select() 可能会无限期挂起。相比之下,pselect () 允许一个人首先阻止信号,处理进来的信号,然后使用所需的 sigmask 调用 pselect(),避免竞争。)

我不明白段落中描述的竞争条件是如何发生的。你能帮忙弄出来吗?谢谢。

4

1 回答 1

0

假设您的信号处理程序在调用时设置了一个全局 g_Signaled,然后您有如下代码:

if( g_Signaled == false )
{
   // Suppose signal is fired here, after test of g_Signaled but before entering select.
   select( ... );
}

在这种情况下,即使信号已经触发,选择也会无限期地阻塞。pselect 解决了这个问题,因为您可以暂时阻止信号,测试标志,然后使用 pselect 原子地阻止并重新启用信号。

于 2014-01-21T01:59:55.463 回答