当std :: atomic <t> :: is_always_lock_free为false时std :: atomic <t>是否安全?

时间:2018-06-12 15:24:06

标签: c++ embedded interrupt atomic

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

通常,任何时刻,控制都可以被中断以处理中断。特别是,如果一个人天真地拥有一个互斥体并希望用它来对变量做一个“安全”,那么可以锁定它,写入和解锁,然后锁定,读取和解锁。但如果读取处于中断状态,则可以锁定,中断,锁定=&gt;死锁。

特别是,std::atomic<int>is_always_lock_free false。我应该担心僵局吗?当我查看生成的程序集时,编写42看起来像:

bl __sync_synchronize
mov r3, #42
str r3, [sp, #4]
bl __sync_synchronize

似乎没有锁定。用于读取值的asm是类似的。 ({1}}

等发烧友操作的(可能)锁定

1 个答案:

答案 0 :(得分:3)

对于完整的内存屏障,

__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上,并且当然从你提供的程序集看起来似乎没有使用锁。