在没有操作系统的嵌入式(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}}
等发烧友操作的(可能)锁定答案 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上,并且当然从你提供的程序集看起来似乎没有使用锁。