<T> 当 std::atomic<T>::is_always_lock_free 为假时,中断是否安全?

Is std::atomic<T> safe with interrupts when std::atomic<T>::is_always_lock_free is false?

本文关键字:lt gt 是否 安全 中断 lock std atomic is free always      更新时间:2023-10-16

在没有操作系统的嵌入式(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只是一个完整的内存屏障的内置。不涉及锁定,因此不会像互斥锁和中断处理程序那样出现死锁。

您使用的是哪种 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 上在没有锁的情况下实现,当然从您提供的程序集来看,它似乎没有使用锁。