在没有操作系统的嵌入式(ARM)环境中,如果使用中断,那么使用
一般而言,在任何时候,控制流都可能被中断以处理中断。特别地,如果想要使用互斥锁对变量进行“安全”写操作,一个简单的方法是先锁住,然后写入并解锁,其他位置再锁住、读取并解锁。但如果读取在中断中进行,则可能导致锁定、中断、锁定 => 死锁。
具体来说,我有一个
std::atomic<T>
是否会出现死锁?如果会,如何避免?一般而言,在任何时候,控制流都可能被中断以处理中断。特别地,如果想要使用互斥锁对变量进行“安全”写操作,一个简单的方法是先锁住,然后写入并解锁,其他位置再锁住、读取并解锁。但如果读取在中断中进行,则可能导致锁定、中断、锁定 => 死锁。
具体来说,我有一个
std::atomic<int>
,其中is_always_lock_free
为false
。我应该担心死锁的情况吗?当我查看生成的汇编代码时,写入42
的样子如下:bl __sync_synchronize
mov r3, #42
str r3, [sp, #4]
bl __sync_synchronize
似乎没有出现锁定。读取值的汇编代码类似。那么对于像exchange
这样的复杂操作,是否存在(可能的)锁定呢?
__sync_synchronize
只是一个内存屏障,那么这段代码只能防止多个核心重新排序或预取指令。据我所知,它不能防止中断,并且生成的汇编代码不是中断安全的。为了使此代码安全,__sync_synchronize
必须禁用所有可屏蔽中断。如果没有这样做,我会称其为不符合规范的实现。 - Lundin_Atomic int
并查看它是否生成相同的汇编。 - Lundin