gpt4 book ai didi

c - sig_atomic_t在linux信号屏蔽函数中的使用

转载 作者:太空狗 更新时间:2023-10-29 11:40:02 25 4
gpt4 key购买 nike

我最近在学习名为 Advanced Linux Programming 的书,我遇到了这个问题:这本书说你应该使用 sig_atomic_t 变量类型来确保如果你在一个全局标志或计数器中设置信号处理函数,在算术运算(即 ++)和将它们保存到寄存器之间不会发生上下文切换。

我的问题是:如果我们不使用 sig_atomic_t 而只是使用另一种类型并且发生上下文切换,会发生什么情况?我的意思是程序只会返回并稍后保存。有人能给我一个会使我们的代码不稳定或出现错误的场景吗?

最佳答案

在您描述的场景中(从内存读取到寄存器、更新寄存器、写入内存以及在任何这些操作之间发生上下文切换)您面临的风险是您可能会丢失在其他上下文中进行的更新。

例如:

main context:
read i (=10) from memory to register R1
add 5 to R1
<interrupt. Switch to interrupt context>
read i (=10) from memory to register R1
add 10 to R1
write R1 to i in memory (i = 20)
<end of interrupt. Back to main context>
write R1 to i in memory (i = 15)

如您所见,中断更新已丢失。

如果您的类型需要多次操作才能将其写入内存并且中断发生在写入操作的中间,则会出现更大的问题。

例如:

main context:
read first half of i (=10) from memory to register R1
read second half of i (=10) from memory to register R2
add 5 to R1/R2 pair
write R1 to first half of i in memory
<interrupt. Switch to interrupt context>
read first half of i (= ??) from memory to register R1
read second half of i (= ??) from memory to register R2
add 10 to R1/R2 pair
write R1 to first half of i in memory
write R2 to second half of i in memory
<end of interrupt. Back to main context>
write R2 to second half of i in memory

在这里,不知道我最终会得到什么值。

有了 sig_atomic_t,第二个问题就不会发生,因为该类型保证使用原子读/写操作。

关于c - sig_atomic_t在linux信号屏蔽函数中的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3889510/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com