c - 具有静态变量的信号处理程序中的竞争条件

标签 c signals race-condition signal-handling

在单线程程序中,信号处理程序中是否可能出现竞争条件?

void signal_handler(...)
{
  static int i = 0;
  i = i + 10 * 10;
}

想象一下,抛出两个非常接近的信号,非常接近以至于它们同时进入函数。

我找不到有关最新 Linux 操作系统如何处理此问题的信息。我只知道两个信号都得到了正确处理,但我不知道如何处理。竞争条件是否可能?

感谢任何帮助,谢谢!

最佳答案

在您的意思(两个信号之间)的意义上,不存在竞争条件。同一信号的多个信号不会同时传送。 除非采取预防措施,否则可能会同时传送不同信号编号的多个信号,如 torek 的回答中所述。

每当涉及静态持续时间变量(或全局变量)时,您的函数可能不再可重入。这对于信号处理函数本身通常并不重要。但是,如果它调用其他一些访问全局或静态数据的函数,那么该函数将看到类似于两个线程在临界区中竞速的访问模式。也就是说,您的程序正在调用这样一个函数来执行其正常处理,但是信号到达该函数的中间,然后您的信号处理程序调用同一个函数。全局/静态变量可能处于不一致的状态,并可能导致您的程序具有不确定的行为。

POSIX 定义了一组可以从信号处理程序中安全调用的 API。当您计划让信号处理程序调用您实现的函数时,您的代码应该采取类似的预防措施。

关于c - 具有静态变量的信号处理程序中的竞争条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16823102/

相关文章:

c - 结构体数组的最后一个元素 - C

ios - 使用两个 TableView 时发生竞争条件并且应用程序崩溃

python - scipy.weave.inline 的竞争条件

c - 信号处理C语言编程

c - Perl:阻塞信号没有延迟 -> 提供了测试代码

python-3.x - 从内置麦克风获取音频信号

python - Django ArrayField 追加,避免竞争条件

c - Erlang:阻止 C NIF 调用行为

c - 如何取消引用 ASM 数据段中的指针?

C: GTK+ 3.0 (3.20) - 从 GNU/Linux (Arch Linux) 到 Windows 的交叉编译