【发布时间】:2018-11-22 01:27:09
【问题描述】:
在没有操作系统的嵌入式 (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
这似乎没有被锁定。读取值的 asm 类似。像exchange 这样更高级的操作是否(可能)锁定?
【问题讨论】:
-
如果
__sync_synchronize只是一个内存屏障,那么这段代码只能防止多核重新排序或预取指令。据我所知,它不能防止中断,因此生成的汇编程序不是中断安全的。__sync_synchronize必须禁用所有可屏蔽中断才能确保此代码安全。如果不是,我会称实现不合格。 -
要排除这与之前的许多 C++ 故障一样,您可以尝试 C11
_Atomic int并查看它是否生成相同的汇编程序。 -
我相信内存读写在我的处理器上是原子的,而且我相信它不会重新排序,所以我认为至少就我的目的而言,同步不是必需的。
-
这是几条指令,因此根据定义它不是原子的。
标签: c++ embedded interrupt atomic