在没有操作系统的嵌入式 (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
只是一个builtin一个完整的内存屏障。不涉及锁定,因此不会像互斥锁和中断处理程序那样出现死锁。
您使用的是什么 ARM 内核?在 ARM Cortex-A7 上,以下打印 true
对彼此而言。
#include <iostream>
#include <atomic>
int main()
{
std::atomic<int> x;
std::cout << std::boolalpha << x.is_lock_free() << std::endl;
std::cout << std::atomic<int>::is_always_lock_free << std::endl;
}
我希望 std::atomic<int>
如果不是全部在 ARM 上,大部分(如果不是全部)都可以在没有锁的情况下实现,当然从您提供的程序集来看,它似乎没有使用锁。
关于c++ - 当 std::atomic<T>::is_always_lock_free 为 false 时,std::atomic<T> 对于中断是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50820710/