c++ - 当 std::atomic<T>::is_always_lock_free 为 false 时,std::atomic<T> 对于中断是否安全?

标签 c++ embedded interrupt atomic

在没有操作系统的嵌入式 (ARM) 环境中,如果我使用中断,那么使用 std::atomic<T> 是否存在死锁的可能性? ?如果是这样,如何?

一般来说,任何时刻,控制都可以被中断来处理中断。特别是,如果一个人天真地拥有一个互斥锁并想用它对变量做一个“安全”操作,那么他可能会锁定它、写入和解锁,然后在其他地方锁定、读取和解锁。但如果读取处于中断状态,则可以锁定、中断、锁定 => 死锁。

特别是,我有一个 std::atomic<int>为此 is_always_lock_freefalse .我应该担心僵局吗?当我查看生成的程序集时,写着 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/

相关文章:

c - 将数组元素移出数组范围时会发生什么?

android - 从 Laravel 后端触发对 Android Studio 的自动响应

c - 七段显示滚动

c - EFM32 Giant Gecko,中断程序不工作

x86 - MSI-X 如何触发中断处理程序?是否需要轮询选择的内存地址?

c++ - 我试图了解内存分配的工作原理以及发生的时间

c++ - 加载时动态链接库调度

c++ - C++14及以上的stm32 hal库警告

c++ - 在调试器中查看重复命名的全局变量?

embedded - 减小可执行文件大小的过程