在没有操作系统的嵌入式(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这样的花里胡哨的操作的(可能)锁
发布于 2018-06-13 00:05:25
__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上实现时大部分都没有锁,当然从你提供的程序集来看,它似乎没有使用锁。
https://stackoverflow.com/questions/50820710
复制相似问题